Kotlin嵌套枚举类

问题描述 投票:0回答:2

当我在玩enums时,我创造了这个:

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

这是一个很好的实现吗?这不好吗?肯定会感觉很奇怪! 我想听听你对这个的评论!

kotlin enums inner-classes
2个回答
3
投票

您需要考虑外部代码如何使用这些枚举。从本质上讲,你正在创造另一个namespace。第一个命名空间是包,第二个是类。对于开发人员来说,这可能会变得乏味。它还要求首先键入类,以便IDE自动完成。

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

最后,如果这些枚举将自己使用,在类外部使用,或者由其他类共享,那么绝对不要嵌套它们。


1
投票

根据你的代码,ElectricPart没有理由成为enum class - 没有调查员的枚举是毫无意义的。

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

汽车有电子零件(ElectricPart)。 VisionLights和DirectionLights是汽车电子设备的一部分。

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

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

请记住,当您拥有在每个实现中重写的方法时,接口主要非常有用,以实现多态行为。尽管如此,也可以在需要使用较少类型安全的Any的地方使用标记接口(没有方法的接口)。

© www.soinside.com 2019 - 2024. All rights reserved.