сравнить и вложенные перечисления - PullRequest
1 голос
/ 04 мая 2010

in " Руководство для программистов по сертификации Java SCJP " Я нашел пример, которому не могу следовать.

Это данное перечисление:

enum Scale3 {
    GOOD(Grade.C), BETTER(Grade.B), BEST(Grade.A);

    enum Grade {A, B, C}

    private Grade grade;

    Scale3(Grade grade) {
        this.grade = grade;
    }

    public Grade getGrade() { return grade; }
}

Это заданное выражение:

Scale3.GOOD.getGrade().compareTo(Scale3.Grade.A) > 0;

Я не понимаю, почему это выражение будет правдой?
Возвращаемое значение будет 2.

compareTo () вернет значение> 0, если данный объект «меньше» объекта.

Scale3.Grade.A является «самым большим» элементом рангов, его порядковый номер равен 0.

Scale3.GOOD является «самым большим» элементом Scale3, его порядковый номер также равен 0.

Конструктор Scale3 вызывается с Scale3.Grade.C , порядковый номер которого равен 2.

Таким образом, данное выражение равно следующему коду:

Scale3.Grade.C.compareTo(Scale3.Grade.A) > 0;

A «больше», чем C , поэтому результат не должен быть <0? </p>

Ответы [ 2 ]

5 голосов
/ 04 мая 2010

Перечисления реализуют интерфейс Comparable, и сравнение основано на их порядковом номере (их позиция в объявлении перечисления).

Порядковое значение Scale3.Grade.A равно 0, а порядковое значение Scale3.Grade.C равно 2. Следовательно, C «больше», чем A.

См. Реализацию Enum.compareTo (E o).

2 голосов
/ 04 мая 2010

A "больше", чем C, поэтому результат не должен быть <0? </p>

Нет, A меньше, чем C, поскольку оно предшествует C в enum Grade {A, B, C}

Обратите внимание, что порядок A, B и C поменялся местами в

GOOD(Grade.C), BETTER(Grade.B), BEST(Grade.A);

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