Вложенный перечислимый класс Kotlin - PullRequest
0 голосов
/ 23 апреля 2019

Пока я играл с enum s, я создал это:

enum class ElectricPart {
    // Wow, what I had implemented here? Is it good or bad?!
    ;
    enum class VisionLight(val id:String){
        LIGHTS_OFF("lights_off"),
        POSITION_LIGHTS("lights_position"),
        DRIVING_LIGHTS("lights_driving"),
        LONG_RANGE_LIGHTS("lights_long_range"),
        LONG_RANGE_SIGNAL_LIGHTS("lights_long_range_signal")
    }
    enum class DirectionLight(val id:String){
        DIRECTION_LIGHTS_RIGHT("lights_direction_right"),
        DIRECTION_LIGHTS_LEFT("lights_direction_left"),
        DIRECTION_LIGHTS_STRAIGHT("lights_direction_straight")
    }
    //More enum classes if needed
}

Автомобиль имеет электрические детали (ElectricPart). VisionLight s и DirectionLight s являются частью электрики автомобиля.

Это хорошая реализация? Это плохо? Наверняка это странно!
Я хотел бы услышать ваши комментарии об этом!

Ответы [ 2 ]

3 голосов
/ 23 апреля 2019

Вам нужно подумать о том, как эти перечисления будут использоваться внешним кодом. По сути, вы создаете еще один namespace. Первое пространство имен - это пакет, а второе - класс. Это может стать утомительным для разработчиков, чтобы напечатать. Также необходимо, чтобы класс набирался первым, чтобы ваше автозаполнение IDE вступило в силу.

Если пакет не насыщен слишком многими определениями, или если есть потенциальные конфликты имен, может быть лучше определить их вне класса. Kotlin позволяет определять перечисления в том же файле, что и класс, если это помогает вам организовываться на физическом уровне.

Наконец, если эти перечисления будут использоваться сами по себе, вне класса или совместно с другими классами, определенно не вкладывайте их.

1 голос
/ 24 апреля 2019

Согласно вашему коду, ElectricPart не является причиной для enum class - перечисление без перечислителей не имеет смысла.

Для целей именования ElectricPart также может быть class (с закрытым конструктором, т.е. без экземпляров) или object (ровно один одноэлементный экземпляр).Обратите внимание, что классы изначально не предназначены для использования в качестве пространств имен в Kotlin, т. Е. Они оплачиваются за счет затрат времени выполнения JVM, даже если вы используете их имя только во время компиляции.

Автомобиль имеет электрическийчасти (ElectricPart).VisionLight s и DirectionLight s являются частью электрики автомобиля.

Это звучит как типичные отношения : видение и указатели поворота являются электрическими частями автомобиля.Это отношение обычно моделируется с помощью наследования и реализации интерфейса, поэтому вы можете сделать это следующим образом:

interface ElectricPart
enum class VisionLight(val id:String) : ElectricPart {...}
enum class DirectionLight(val id:String) : ElectricPart {...}

Имейте в виду, что интерфейсы в первую очередь полезны, когда у вас есть методы, которые переопределяются в каждой реализации, для достижения полиморфного поведения,Тем не менее, также возможно использовать маркерные интерфейсы (интерфейсы без методов) в тех местах, где в противном случае вам пришлось бы использовать менее безопасный тип Any.

...