Освой программирование играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

Перечисления enum

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

Перечисления создаются с использованием ключевого слова enum. Создадим перечисление семейства кошачьих:


enum Cat {
    Leopard, Puma, Lion, Tiger, Manul
}

Идентификаторы в фигурных скобках называются константами перечисления. Каждый из них явно объявлен как открытый статический финальный член класса Cat. Объявив перечисление, вы можете создавать переменные этого типа. Но делать это нужно без оператора new, а в упрощенном виде. Объявим переменную manul перечислимого типа Cat.


Cat manul;

Вы можете присвоить переменной только те значения, которые определены в перечислении, например:


manul = Cat.Manul;

Обратите внимание, что во время присваивания вы указываете и тип Cat.

Использование перечисляемых переменных позволят избежать ошибок. Например, мы хотим использовать только числа 1, 2, 3 и такой способ не позволит использовать числа 0, 5, 9 и т.д.

Перечислимые константы можно проверить на равенство:


if (manul == Cat.Manul) {
    String result = "Погладь кота, ...";
}

Также их можно применять в конструкции switch, где у операторов case используются константы из перечисления enum. При этом имена констант используются без имени типа перечисления.


enum Cat {
	Leopard, Puma, Lion, Tiger, Manul
}

public void onClick(View v) {
	Cat cat;
	cat = Cat.Manul;
	String result = "";
    
	switch (cat) {
	case Leopard:
		result = "Я леопард";
		break;
	case Puma:
		result = "Я пума";
		break;
	case Lion:
		result = "Я царь зверей";
		break;
	case Tiger:
		result = "Я тигра";
		break;
	case Manul:
		result = "Погладь кота, ...";
		break;
	}
	textViewInfo.setText(result);
}

Метод values()

Автоматически предопределённый метод для перечисления values() возвращает массив, содержащий список констант перечисления.


enum Cat {
	Leopard, Puma, Lion, Tiger, Manul
}

public void onClick(View v) {
	Cat[] allcats = Cat.values();

	for(Cat cat : allcats) {
	    System.out.println(cat);
	}
}

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


for(Cat cat : Cat.values()) {
    System.out.println(cat);
}

Метод valueOf(String string)

Автоматически предопределённый метод для перечисления valueOf() возвращает константу перечисления, значение которой соответствует строке, переданной в параметре.


enum Cat {
	Leopard, Puma, Lion, Tiger, Manul
}

public void onClick(View v) {
	Cat cat;
	cat = Cat.valueOf("Puma");

	infoTextView.setText(cat.toString());
}

Так как перечисление в Java - это тип класса, то вы можете использовать конструкторы, добавлять переменных экземпляров, методы и интерфейсы. Следует сказать, что в Android сначала не рекомендовалось использовать перечисления из-за большого потребления памяти. Сейчас вроде это ограничение сняли, но тем не менее пока перечисления не так широко используются в приложениях для мобильных устройств, поэтому подробно разбирать все возможности перечисления не будем.

Метод ordinal()

У перечислений есть несколько удобных методов. Например, вы можете получить значение, которое указывает позицию константы в списке констант перечисления (порядковое значение или ordinal value), с помощью метода ordinal(). Порядковые значения начинаются с нуля.


for(Cat cat : Cat.values()) {
	System.out.println(cat + " Его порядковое значение" + cat.ordinal());
}

Методы compareTo() и equals()

Также можно сравнивать порядковые значения констант одного и того же перечисления с помощью метода compareTo(). Или сравнить на эквивалентность через метод equals().

Увлекаться не стоит из-за большого потребления памяти. Сравним.


// занимает 1112 байт
public static enum Things {
    THING_1,
    THING_2
};

// другой вариант, занимает 128 байт
public static int THING_1 = 0;
public static int THING_2 = 1;

По этой причине на сегодняшний день в Android рекомендуется избегать enum. Хотя в последнее время я встречал использование перечислений в исходных кодах Android.

Дополнительное чтение

Android Performance: Avoid using ENUM on Android

Реклама