【问题标题】:Kotlin nested enum classKotlin 嵌套枚举类
【发布时间】:2019-09-12 08:43:12
【问题描述】:

当我在玩 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 是汽车电子设备的一部分。

这是一个好的实现吗?这很糟糕吗?肯定感觉怪怪的!
我想听听你们的 cmets 关于这个!

【问题讨论】:

  • 如果你不知道你创造了什么,那就糟糕了
  • @TimCastelijns 正如我所说,我在玩,我没有输入随机字符!我是故意这样做的,我想知道这是否是一个好方法!使用嵌套枚举类是一种好习惯吗?为什么在新的enum 类之前它似乎需要;
  • 使用嵌套枚举类是一种好习惯吗? - 可能不是。我想不出你会使用它(或如何)的情况
  • 如果你做某事,你应该有理由去做。我们不能说它在虚空中是好是坏。它实现的目的是什么?你想用这种结构表达什么?
  • 我进行了编辑,并试图更具体。这是我正在考虑的一个简单的想法/示例。

标签: kotlin enums inner-classes


【解决方案1】:

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

除非包中包含太多定义,或者存在潜在的名称冲突,否则最好在类之外定义它们。 Kotlin 允许枚举仍然与类定义在同一个文件中,如果这有助于在物理层面上保持组织。

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

【讨论】:

    【解决方案2】:

    根据您的代码,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 的地方使用标记接口(没有方法的接口)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-20
      • 1970-01-01
      • 2011-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-31
      相关资源
      最近更新 更多