2016-05-22 3 views
0

я столкнулся вопрос, чтобы написать кусок кода Java, как:В чем разница между «Foo» .equals (возможно, Foo) и возможноFoo == null? False: maybeFoo.equals («Foo»)?

boolean isFoo(String maybeFoo){ 
    //Return true if maybeFoo is equal to "Foo" 
    //Don't throw any exceptions. 
} 

У меня есть два варианта:

1. return "Foo".equals(maybeFoo); 
2. return maybeFoo==null?false:maybeFoo.equals("Foo"); 

Я выбираю номер 1, но я не могу назвать причину, почему номер 2 неверно. Я сказал интервьюеру, это просто моя привычка заниматься сильным типом языка. Но он, похоже, не удовлетворен.

+1

Что такое метод 'maybeFoo' в 2.? – Tunaki

+0

Второй вариант также может быть «return maybeFoo! = Null && maybeFoo.equals (« Foo »);'. – Tom

+1

Я думаю, что параметры были даны интервьюером – Keiwan

ответ

1

Разница между тем, именно то, что вы написали в 2-х вариантов

"Foo".equals(maybeFoo); 

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

с другой стороны, это

maybeFoo.equals("Foo") 

выбросит исключение NPE только потому, что вызывают методы на нулевую ссылке объекта

+1

, но no.2 сначала проверяет значение null. – Pythoner

+0

Да, я вижу, но чем меньше вы проверяете, тем лучше. –

1

Прежде всего следует сказать, что обе версии обеспечивают одинаковый выход, и ни один из них не генерирует исключение, так что это просто вопрос, какой способ является его .

return "Foo".equals(maybeFoo); 

это лучший способ делать то, что указано, потому что даже если maybeFoo имеет нулевое значение, функция Java equals возвращает false и не сгенерирует исключение.

Однако, если maybeFoo было null, вы не можете позвонить по функции equals, иначе вы получите NullPointerException. Следовательно, вы должны проверить его во втором примере.

Дело в том, что если вы можете сделать что-то работу с менее и очиститель кода, вы должны пойти с этим, потому что это делает ваш код более читаемым и менее склонны к ошибкам.

+0

* «лучший способ» * Это просто мнение; * «Однако, если' maybeFoo' был ложным »* Это никогда не возможно. * «Чистый код» * Вызов условий йоды «Чище» также также мнение (imo bad) – Tom

+0

Предположим, что значение null явно, а не false. Исправлено. Я не вижу, как удалить необходимость в дополнительной проверке нуля, используя свойство уже определенной функции java и, следовательно, сокращение вашего кода не является «более чистым» способом написания кода. – Keiwan

+0

Зависит от вашего отношения do 'null', и если значение null является допустимым. Существует мнение, что «null» не следует использовать в качестве допустимого значения, поскольку в основном это означает ошибку программирования.Это останется скрытым, когда вы молча провалите свой тест, и вы не знаете, почему, потому что вы думаете, что 'возможноFoo'_should_ содержать' 'Foo' '([больше об исключении' null'] (https://github.com/ Google/гуавы/вики/UsingAndAvoidingNullExplained)). – Tom