【问题标题】:Expandable enum Java可扩展的枚举 Java
【发布时间】:2013-09-28 12:20:02
【问题描述】:

我正在制作一个程序,它有一个我们用于类型列表的枚举,但我希望它有可能在运行时稍后被扩展,但我不确定最好的方法是什么。我能想到的唯一方法是使用类数组代替我不想做的枚举,因为我会失去枚举的简单性。

【问题讨论】:

  • “枚举类型是一种特殊的数据类型,它使变量能够成为一组预定义的常量。”这里听起来不再像枚举了:)
  • 枚举用于枚举在编译时固定且已知的常量。如果您有在编译时还不为您所知的数据(即,您并不完全了解或期望它经常更改),那么枚举可能不是表示它的最佳方式。
  • 这几乎不是Enum 的用例。将Set 与您自己的某些类结合使用。
  • 是否可以让一个枚举实现一个接口,我将如何使用多个枚举来实现?
  • 是的,但问题不同。

标签: java enums expandable


【解决方案1】:

枚举应该是完全静态的枚举,因此您必须能够知道枚举在编译时涵盖的确切值。

您可以在编译时生成 java 文件,从而在值上提供更多的灵活性,尽管这有点过头了。

你最好的选择是:

1) 使用一个类,可能带有一组预定义实例,以便可以在运行时创建所述类的新实例。

2) 创建一个包含默认值的枚举实现的接口,允许在运行时创建新实例,同时保留某种形式的枚举结构。

【讨论】:

  • 枚举的额外值只会被程序的扩展部分使用。
  • @user2248702 “扩展部分”是什么意思?
【解决方案2】:

Java 枚举不能在运行时扩展/扩展。它们更像是常数。如果您需要可扩展的枚举,enum 可能不适合您!

考虑使用一个在运行时实例化的简单类。

【讨论】:

    【解决方案3】:

    如果您无法知道编译时需要存在的所有值,我会使用字符串。如果要将属性或行为与其关联,可以使用映射。这在 Java 中相当普遍。同样在 python 中,人们使用字符串作为枚举。

    Java 7 使 switch 语句适用于字符串,这是 IMO 支持这种字符串使用的举措。

    有关 Java 中此类用法的示例,请参见: https://github.com/netty/netty/blob/master/example/src/main/java/io/netty/example/telnet/TelnetClientInitializer.java

    【讨论】:

    • 当使用字符串时,你会失去一些 Java 枚举的力量——你不能为字符串定义额外的方法
    • intString 枚举模式应被视为 Java 中的反模式。 Java enum 语言特性提供了 int/String 枚举模式所缺乏的类型安全和实例控制保证(以及对象可扩展性的大多数重要特性)。此外,使用特定于常量的枚举方法代替值上的 switch 语句的代码不那么脆弱且更易于维护。
    • @scottb:我同意,除非在编译时不知道需要支持的值。那么你就不能使用枚举了。
    【解决方案4】:

    枚举在编译时是固定的。您将如何“使用简单性”?例如,您不能使用事先不知道的常量编写switch 命令。

    如果要根据某物的类型进行分支,您可以使用经典的 OO 分解(在列表中的每个类型中创建方法并让多态性选择正确的分支)或使用 HashMap 从类对象到功能对象或战略实施。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-08
      • 2010-12-10
      • 2011-09-24
      • 1970-01-01
      • 2021-02-04
      • 1970-01-01
      相关资源
      最近更新 更多