当我在玩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是汽车电子设备的一部分。
这是一个很好的实现吗?这不好吗?肯定会感觉很奇怪! 我想听听你对这个的评论!
您需要考虑外部代码如何使用这些枚举。从本质上讲,你正在创造另一个namespace
。第一个命名空间是包,第二个是类。对于开发人员来说,这可能会变得乏味。它还要求首先键入类,以便IDE自动完成。
除非包中包含太多定义,或者存在潜在的名称冲突,否则最好在类外定义它们。 Kotlin允许枚举仍然在与该类相同的文件中定义,如果这有助于使您在物理级别上有条理。
最后,如果这些枚举将自己使用,在类外部使用,或者由其他类共享,那么绝对不要嵌套它们。
根据你的代码,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
的地方使用标记接口(没有方法的接口)。