我在玩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
)。 VisionLight
和DirectionLight
是汽车电子设备的一部分。
这是一个好的实现吗?这不好吗?当然,这感觉很奇怪!
我想听听您对此的评论!
答案 0 :(得分:3)
您需要考虑外部枚举将如何使用这些枚举。本质上,您正在创建另一个namespace
。第一个名称空间是程序包,第二个名称空间是类。对于开发人员而言,键入该代码可能变得很乏味。它还要求首先输入该类,以使您的IDE自动完成功能生效。
除非程序包中包含太多的定义,或者存在潜在的名称冲突,否则最好在类外部定义它们。 Kotlin允许仍将枚举定义在与类相同的文件中,如果这有助于使您在物理层次上井井有条。
最后,如果这些枚举将在类之外单独使用或由其他类共享,则绝对不要嵌套它们。
答案 1 :(得分:1)
根据您的代码,没有必要将ElectricPart
设为enum class
-没有枚举数的枚举是没有意义的。
出于命名空间的目的,ElectricPart
也可以是class
(具有私有构造函数,即没有实例)或object
(恰好是一个单例实例)。请注意,类并不是在Kotlin中最初主要设计为用作名称空间的,即,即使您仅在编译时使用它们的名称,它们也以JVM运行时开销为代价。
汽车具有电气部件(
ElectricPart
)。VisionLight
和DirectionLight
是汽车电子设备的一部分。
这听起来像是典型的是一种关系:视觉灯和方向灯 是汽车的电气部件。这种关系通常通过继承和接口实现来建模,因此您可以这样做:
interface ElectricPart
enum class VisionLight(val id:String) : ElectricPart {...}
enum class DirectionLight(val id:String) : ElectricPart {...}
请记住,当您在每个实现中都有被重写的方法来实现多态行为时,接口主要有用。不过,也可以在原本必须使用类型安全性较低的Any
的地方使用标记接口(没有方法的接口)。