Kotlin嵌套枚举类

时间:2019-04-23 07:49:10

标签: kotlin enums inner-classes

我在玩enum时创建了这个:

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)。 VisionLightDirectionLight是汽车电子设备的一部分。

这是一个好的实现吗?这不好吗?当然,这感觉很奇怪!
我想听听您对此的评论!

2 个答案:

答案 0 :(得分:3)

您需要考虑外部枚举将如何使用这些枚举。本质上,您正在创建另一个namespace。第一个名称空间是程序包,第二个名称空间是类。对于开发人员而言,键入该代码可能变得很乏味。它还要求首先输入该类,以使您的IDE自动完成功能生效。

除非程序包中包含太多的定义,或者存在潜在的名称冲突,否则最好在类外部定义它们。 Kotlin允许仍将枚举定义在与类相同的文件中,如果这有助于使您在物理层次上井井有条。

最后,如果这些枚举将在类之外单独使用或由其他类共享,则绝对不要嵌套它们。

答案 1 :(得分:1)

根据您的代码,没有必要将ElectricPart设为enum class -没有枚举数的枚举是没有意义的。

出于命名空间的目的,ElectricPart也可以是class(具有私有构造函数,即没有实例)或object(恰好是一个单例实例)。请注意,类并不是在Kotlin中最初主要设计为用作名称空间的,即,即使您仅在编译时使用它们的名称,它们也以JVM运行时开销为代价。

  

汽车具有电气部件(ElectricPart)。 VisionLightDirectionLight是汽车电子设备的一部分。

这听起来像是典型的是一种关系:视觉灯和方向灯 是汽车的电气部件。这种关系通常通过继承和接口实现来建模,因此您可以这样做:

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

请记住,当您在每个实现中都有被重写的方法来实现多态行为时,接口主要有用。不过,也可以在原本必须使用类型安全性较低的Any的地方使用标记接口(没有方法的接口)。