Java равно () упорядочение - PullRequest
       2

Java равно () упорядочение

7 голосов
/ 05 августа 2010

Если я попытаюсь сделать .equals() для пустой строки в java, возникнет исключение нулевого указателя.Мне интересно, если я пытаюсь сравнить, равна ли строка некоторой константной строке, могу ли я сделать следующее:

MY_CONSTANT_STRING.equals(aStringVariable)

Я знаю, что это будет работать, но действительно ли это действительно плохой код?

Ответы [ 6 ]

20 голосов
/ 05 августа 2010

Это стандартная идиома Java, которая в шутку называется условие Yoda .

Лично я предпочитаю обращаться с нулевым регистром явно, но способ Yoda часто используется и любым опытным программистом Javaдолжен быть в состоянии понять, что происходит немедленно.Это нормально использовать.

6 голосов
/ 06 августа 2010

это действительно очень плохой код?

Нет, именно так многие люди будут кодировать утверждение, чтобы избежать NPE.

5 голосов
/ 06 августа 2010

То, что у тебя есть, хорошо.Можно даже использовать строковый литерал.

if( "value".equals(variable) ) {
    ...

Если вам это не нравится, вы всегда можете явно проверить null и равенство и объединить две проверки с &&.Короткое замыкание оператора гарантирует, что вы никогда не получите NPE.

if( (variable != null) && variable.equals("value") ) {
    ...
1 голос
/ 06 августа 2010

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

Точно так же вы можете избежать проверки на NULL в instanceof-проверках, например:

Food dinner = map.get("dinner");
if (dinner instanceof Soup) {
      ((Soup)blah).eat();
}  // We don't care if it is a Fish or null

Но если вы действительно не ожидали null, вы должны явно проверить это в отдельном if-тесте и обработать его соответствующим образом. Обычно такие ошибки данных лучше выявлять раньше, чем позже.

0 голосов
/ 06 августа 2010

Если вас беспокоит качество вашего кода, напишите вспомогательный класс, который позаботится о тесте на равенство:

public class ObjectHelper {
    public static boolean testEquality(Object o1, Object o2) {
        if (o1 == null && o2 == null) return true;
        if (o1 == null) return false;
        return o1.equalts(o2);
    }
}

Затем используйте его следующим образом:

if (ObjectHelper.testEquality(aStringVariable, My_CONSTANT_STRING))

Ваштак называемая постоянная МОЖЕТ перестать быть постоянной.Это может быть прочитано из файла конфигурации в будущем.

0 голосов
/ 06 августа 2010

Нет, обычно это делается, чтобы избежать NPE.Тем не менее, я обычно предпочитаю делать явные проверки на ноль.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...