Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Герберт Шилдт. Java 2, v5.0 (Tiger). Новые возм...doc
Скачиваний:
5
Добавлен:
01.03.2025
Размер:
1.21 Mб
Скачать

Перечислимые типы, наследующие тип enum

Несмотря на то, что Вы не можете наследовать суперкласс при объявлении типа enum, все перечислимые типы автоматически наследуют один класс java.lang.Enum. Enum— это настраиваемый класс, его объявление приведено в следующей строке:

abstract class Enum <Е extends Enum> E>>

Параметр е обозначает перечислимый тип. У класса Enum нет общедоступных (public) конструкторов. В этом классе определено несколько методов, перечисленных в табл. 6.1 и доступных для всех перечислимых типов. Большая часть методов класса Enum понятна, но есть среди них четыре, заслуживающие более пристального внимания.

Таблица 6.1. Методы, определенные в классе Еnum

Метод

Описание

protected final Object clone() throws

CloneNotSupportedException

Вызов этого метода приводит к генерации исключения типа CloneNotSupportedException. Это препятствует клонированию перечислимых типов

final int compareTo (E e)

Сравнивает порядковые номера двух констант одного перечислимого типа. Возвращает отрицательное значение, если у вызывающей константы порядковый номер меньше, чем у константы е, 0, если номера одинаковые, и положительное значение, если номер вызывающей константы больше номера константы е

final boolean equals(Object obj)

возвращает true, если вызывающий объект и переменная obj ссылаются на одну и ту же константу

final Class<E> getDeclaringClass()

Возвращает перечислимый тип, членом которого является вызывающая константа

final int hashCode{)

Возвращает хэш-код для вызывающего объекта

final String name()

Возвращает полностью определенное (unaltered) имя вызывающей константы

final int ordinal()

Возвращает порядковый номер константы в списке констант

String toString()

Возвращает имя вызывающей константы, Оно может отличаться от имени, использованного при объявлении перечислимого типа

Static<T extends Enum<T>> T

valueOf(Class<T> e-type. String name)

Возвращает константу, связанную с именем, заданным в параметре name, перечислимого типа, указанного в параметре e-type

Вы можете получить порядковый номер константы перечислимого типа в списке констант. Его называют порядковым значением (ordinal value) и извлекают с помощью вызова метода ordinal(). Нумерация констант в списке начинается с 0. Таким образом, в перечислимом типе Apple у константы Jonathan нулевое порядковое значение, у константы GoldenDel оно равно 1, а у константы RedDel2 и т.д.

Существует возможность сравнения двух констант одного и того же перечислимого типа с помощью метода compareTo(), его сигнатура повторена в следующей строке:

final int compareTo (E e)

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

С помощью метода equals (), перегружающего метод equals() класса Object, Вы можете проверить равенство константы перечислимого типа любому другому объекту. Хотя метод способен сравнивать константу с объектом любого типа, равными будут считаться два объекта, ссылающиеся на одну и ту же константу в одном и том же перечислимом типе. В общем, если у двух констант одинаковые порядковые значения, но константы принадлежат разным перечислимым типам, метод equals() не вернет значение true.

Напоминаю о том, что Вы также можете проверять равенство двух констант с помощью операции = =.

Приведенная в листинге 6.5 программа демонстрирует применение методов ordinal(), compareTo() и equals () .

Листинг 6.5. Демонстрация методов ordinal(), compareTo() и equales()

enum Apple {

Jonathan, GoldenDel, RedDel, Winsap, Cortland

}

class EnumDemo4 {

public static void main(String args[])

{

Apple ap, ap2, ap3;

// Obtain all ordinal values using ordinal().

System.out.println("Here are all apple constants" +

" and their ordinal values: ");

for(Apple a : Apple.values())

System.out.println(a + " " + a.ordinal());

ap = Apple.RedDel;

ap2 = Apple.GoldenDel;

ap3 = Apple.RedDel;

System.out.println();

// Demonstrate compareTo() and equals()

if(ap.compareTo(ap2) < 0)

System.out.println(ap + " comes before " + ap2);

if(ap.compareTo(ap2) > 0)

System.out.println(ap2 + " comes before " + ap);

if(ap.compareTo(ap3) == 0)

System.out.println(ap + " equals " + ap3);

System.out.println();

if(ap.equals(ap2))

System.out.println("Error!");

if(ap.equals(ap3))

System.out.println(ap + " equals " + ap3);

if(ap == ap3)

System.out.println(ap + " == " + ap3);

}

}

Далее приведен вывод результатов работы программы из листинга 6.5:

Here are all apple constants and their ordinal values:

Jonathan 0

GoldenDel 1

RedDel 2

Winsap 3

Cortland 4

GoldenDel comes before RedDel

RedDel equals RedDel

RedDel equals RedDel

RedDel == RedDel