Сравнение членов перечисления Java: == или equals ()? - PullRequest
1568 голосов
/ 17 ноября 2009

Я знаю, что перечисления Java скомпилированы в классы с закрытыми конструкторами и несколькими открытыми статическими членами. При сравнении двух членов данного перечисления я всегда использовал .equals(), например,

public useEnums(SomeEnum a)
{
    if(a.equals(SomeEnum.SOME_ENUM_VALUE))
    {
        ...
    }
    ...
}

Однако я только что наткнулся на некоторый код, который использует оператор равенства == вместо .equals ():

public useEnums2(SomeEnum a)
{
    if(a == SomeEnum.SOME_ENUM_VALUE)
    {
        ...
    }
    ...
}

Какой оператор мне следует использовать?

Ответы [ 14 ]

2 голосов
/ 12 декабря 2017

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

Но использование ==, потому что оно работает с перечислениями, означает, что весь ваш код тесно связан с использованием этого перечисления.

Например: Enums может реализовать интерфейс. Предположим, вы используете enum, который реализует интерфейс Interface1. Если позже кто-то изменит его или представит новый класс Impl1 как реализацию того же интерфейса. Затем, если вы начнете использовать экземпляры Impl1, у вас будет много кода для изменения и тестирования из-за предыдущего использования ==.

Следовательно, лучше всего следовать тому, что считается хорошей практикой, если нет какой-либо оправданной выгоды.

1 голос
/ 04 июня 2017

Короче, у обоих есть плюсы и минусы.

С одной стороны, у него есть преимущества использования ==, как описано в других ответах.

С другой стороны, если вы по какой-либо причине заменяете перечисления другим подходом (обычные экземпляры классов), то при использовании == вас кусает. (BTDT.)

0 голосов
/ 04 декабря 2018

== может выдать NullPointerException, если примитивный тип сравнивается с его версией класса. Например:

private static Integer getInteger() {
    return null;
}

private static void foo() {
    int a = 10;

    // Following comparison throws a NPE, it calls equals() on the 
    // non-primitive integer which is itself null. 
    if(a == getInteger()) { 
        // Some code
    }
}
0 голосов
/ 17 октября 2014

Хочу дополнить полигенасмазочными маслами ответ:

Я лично предпочитаю равно (). Но это проверка совместимости типов. Что я считаю важным ограничением.

Чтобы проверить совместимость типов во время компиляции, объявите и используйте пользовательскую функцию в вашем перечислении.

public boolean isEquals(enumVariable) // compare constant from left
public static boolean areEqual(enumVariable, enumVariable2) // compare two variable

Благодаря этому вы получаете все преимущества обоих решений: защиту NPE, легкий для чтения код и проверку совместимости типов во время компиляции.

Я также рекомендую добавить значение UNDEFINED для enum.

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