Страницы

Поиск по вопросам

понедельник, 8 апреля 2019 г.

Когда нужно использовать Enum?

Всем привет. В проектировании приложения часто попадаются статические элементы, например, кнопки нижней навигации, отвечающие за смену фрагмента, списки категорий, чекбоксы, типы сортировок, кнопки соц.сетей и т.д. Везде использую enum. Например, создаю enum для кнопок нижней нааигации и "захардкоживаю" классы фрагментов, для кнопок соц. сетей - енумы с их ссылками, названиями, ссылками на картинки в R.drawable. Для сортировок (скажем из БД) - тоже прямо в полях делаю специфичные экземпляры для ОРМ типа SortedBy. Вообщем, для всех статичных данных использую Enum-ы. Буквально весь проект ими уже кишит.
Я считаю что енумы полезны в случае реальной схожести. Но, сейчас, все больше появляются расширения, к примеру, при переходе на определенный фрагмент требуется кидать инфу об этом в аналитику, причем, для одного определенного фрагмента. Вообшем, сейчас вся эта красота превращается в уродство. Для тех фрагментов к которым не припилена аналитика я в полях приписываю null и потом на них делаю проверки.
Скажите, хорошо ли вообще использовать енумы? Сейчас лучше все переписать (на что?) или дальше писать костыли?
Когда действительно нужно их использовать? И надо ли вообще?


Ответ

Enum следует использовать тогда, когда вам нужно а)конечное, б)заранее определенное, в)адекватно именованное множество г)уникальных значений.
Например у светофора всего три сигнала (утрируя).
public enum TrafficLight{ RED, YELLOW, GREEN; }
Теперь, задавая текущую горящую секцию вы(ваш коллега) сможете использовать только вот этот заданный набор цветов и не сможете задать, например TrafficLight.BLUE
Lights lights = new Lights(); lights.current = TrafficLight.BLUE; // Ошибка момента компиляции // lights.current имеет тип TrafficLight
Enum хороши для создания коротких словарей (например статусов чего-то) или в качестве флагов (если не предполагается их комбинировать). Пихать везде и по любому поводу их, конечно, не нужно.
Кроме того, enum-ы далеко не бесплатны. Обратите внимание, что в Android SDK их практически нет, а вместо них используются числовые константы. Почитайте, почему было сделано так.
Только не бросайтесь изничтожать enum-ы в пользу числовых констант - это далеко не всегда оправдано. :) Например, если мы заменим класс цветов светофора по примеру гугла на числа:
public class TrafficLight{ public static final Integer RED = 1; public static final Integer YELLOW = 2; public static final Integer GREEN = 3; }
То никакой защиты от такого косяка не будет:
Lights lights = new Lights(); lights.current = 4; // Хреннайдибельная ошибка в рантайме // lights.current имеет тип Integer - ни о чем не говорит

Комментариев нет:

Отправить комментарий