Страницы

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

среда, 5 февраля 2020 г.

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

#java #android #enum


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

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

Скажите, хорошо ли вообще использовать енумы? Сейчас лучше все переписать (на что?)
или дальше писать костыли?

Когда действительно нужно их использовать? И надо ли вообще?
    


Ответы

Ответ 1



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 - ни о чем не говорит

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

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