Почему myEnum.ONE не равно myEnum.ONE.toString ()? - PullRequest
1 голос
/ 31 августа 2010

У меня есть следующее перечисление:

public enum myEnum {
    ONE("ONE"), TWO("TWO");

    private String name;

    private myEnum(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return name;
    }
};

Мой вопрос: почему следующее оценивается как ложное? Я подозреваю, что это как-то связано с реализацией метода equals ().

(myEnum.ONE).equals(myEnum.ONE.toString())

Ответы [ 3 ]

5 голосов
/ 01 сентября 2010

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

Более того, поскольку равенства должны быть переходными (что также предусмотрено договором равных), введение вашего правила будет иметь странные последствия. Рассмотрим:

enum Color {
    green, red, blue;
}

enum Experience {
    green, novice, veteran;
}

Должно ли Color.green равняться Experience.green? Наверное, нет, поскольку опыт и цвет действительно разные вещи. Но если "green".equals(Color.green) и "green".equals(Experience.green), Color.green должно быть равно Experience.green.

Таким образом, общее правило таково: объекты не связанных типов не равны.

3 голосов
/ 01 сентября 2010

Да, это метод equals().Для Enum это выглядит так:

public final boolean equals(Object other) { 
    return this==other;
}

Теперь ваш результат ясен: перечисление - это не тот же объект, что и результат метода toString().

1 голос
/ 01 сентября 2010

В вашем выражении значение слева является перечислением. Значение справа является строкой.

Более длинный ответ заключается в том, что .equals в java оценивает по умолчанию, что означает «тот же экземпляр того же объекта», если вы явно не переопределите его с другой формой оценки. В случае с emums они по сути являются синтаксическим сахаром, гарантирующим единичные значения экземпляров для каждого элемента в перечислении. Следовательно, enum equals смотрит, чтобы увидеть, является ли это тем же элементом.

Итак, MyENum.ONE - это ссылка на экземпляр MyEmum, из которых только один. Каждый раз, когда у вас есть MyEnum.ONE, это один и тот же экземпляр. если вы спросите его, равно ли ему что-то еще, он ответит только true для экземпляра MyEnum.ONE.

...