Делает Java, имеют, “вид класса” метод тестирования

Для моей страны (Вьетнам) getLocality вернет ноль, а addresses.get(0).getAddressLine(0) вернет район, а не город

Так что я буду делать так

Geocoder geocoder = new Geocoder(this, Locale.getDefault());
List<Address> addresses = geocoder.getFromLocation(latitude, longitude, 1);

int maxAddressLine = addresses.get(0).getMaxAddressLineIndex();

String countryName = addresses.get(0).getAddressLine(maxAddressLine);
String stateName = addresses.get(0).getAddressLine(maxAddressLine-1);
String cityName = addresses.get(0).getAddressLine(maxAddressLine-2);
28
задан James P. 6 April 2012 в 09:19
поделиться

4 ответа

if (obj.getClass().isInstance(Statement.class)) {
   doStuffWithStatements((Statement) obj));
}

Самое приятное в этом техника (в отличие от ключевого слова instanceof) заключается в том, что вы можете передавать тестовый класс как объект. Но, да, в остальном он идентичен instanceof.

ПРИМЕЧАНИЕ: Я сознательно избегал редакционных статей о том, является ли проверка экземпляра типа правильным делом. Да, в большинстве случаев лучше использовать полиморфизм. Но ОП спросил не об этом, и я просто отвечаю на его вопрос.

62
ответ дан 28 November 2019 в 02:14
поделиться

Ответ на ваш вопрос - instanceof.

Однако, имейте в виду, что если вашему коду нужен instanceof, это признак того, что что-то не так с вашим дизайном. Бывают случаи, когда instanceof оправдан, но это скорее исключения. Обычно, если вашим подклассам нужно вести себя по-другому, вы должны использовать полиморфизм вместо if ().

6
ответ дан 28 November 2019 в 02:14
поделиться
if(object instanceof WhereStatement) {
   WhereStatement where = (WhereStatement) object;
   doSomething(where);
}

Обратите внимание, что такой код обычно означает, что в вашем базовом классе отсутствует полиморфный метод. т.е. doSomething () должен быть методом утверждения , возможно абстрактным, который переопределяется подклассами.

76
ответ дан 28 November 2019 в 02:14
поделиться

Это не способ делать что-то объектно-ориентированным способом, это возврат к старой дихотомии код / ​​данные. Это не обязательно плохо (если вы знаете, что делаете), но это следует оставить на усмотрение не объектно-ориентированных языков, таких как C.

При правильном проектировании вам не нужно такое поведение. Вместо конструкции:

if (obj.getClass().isInstance(Statement.class)) {
    doStuffWithStatements((Statement) obj));
}

(извиняюсь перед Бенджисмитом за «кражу» его кода) вы действительно должны сделать сам объект ответственным за свои собственные действия следующим образом:

obj.doStuff();

Тогда каждый отдельный класс obj будет есть собственное определение для doStuff . Это правильный способ сделать это.

0
ответ дан 28 November 2019 в 02:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: