我正在做一个程序,它有一个枚举,我们用于列表的类型,但我希望它有可能在运行时稍后扩展,我不确定什么是最好的方法来做到这一点是。我能想到的唯一方法是使用类的数组来代替我不想做的枚举,因为我会放弃枚举的简单性。可扩展的枚举Java
回答
枚举应该是完全静态的枚举,因此你必须能够知道枚举覆盖在编译时的精确值。
您可以在编译时生成java文件,这样可以在值上有更多的灵活性,尽管这可能会比较高。
你最好的选择是:
1)要使用一个类,可能与一组预定义的情况下,使表示新的类实例可以在运行时创建的。
或
2)要创建包含一个枚举的默认值工具,允许在运行时被创建的新的实例,同时保持某种形式的枚举结构的接口。
枚举的额外值只能被程序的扩展部分使用。 – user2248702
@ user2248702“扩展部分”是什么意思? – Sinkingpoint
Java枚举不能在运行时扩展/扩展。它们更像常量。如果你需要可扩展的枚举,也许enum
不适合你!
考虑使用在运行时实例化的简单类。
如果你不知道在编译时需要在那里的所有值,我只是使用字符串。如果您想将属性或行为关联到它,您可以使用地图。这在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枚举的某些功能 - 但您无法为字符串的其他方法定义 – Sinkingpoint
int或String类型的枚举模式在Java中应被视为反模式。Java enum语言功能提供了int/String枚举模式缺乏的类型安全和实例控制(以及对象可扩展性的大部分优点)的保证。而且,使用常量特定的枚举方法代替值上的'switch'语句的代码不那么脆弱并且更易于维护。 – scottb
@scottb:我同意,除非需要支持的值在编译时不知道。那么你不能使用枚举。 –
枚举在编译时是固定的。你会如何“使用简单”?例如,您不能使用事先不知道的常量编写switch
命令。你可以使用经典的OO分解(在列表中的每个类型中创建方法,并让多态选择正确的分支),或者使用类对象中的HashMap到功能对象或战略实施。
- 1. Java可扩展枚举
- 2. 可扩展枚举的扩展方法
- 3. 可扩展枚举计划
- 4. 扩展枚举?
- 5. “扩展”枚举
- 6. 扩展枚举
- 7. 扩展枚举
- 8. 扩展枚举类
- 9. 扩展字段枚举的Java
- 10. Java扩展枚举的switch语句
- 11. #define枚举或如何扩展枚举
- 12. Java枚举:列出Class <?中的枚举值扩展枚举>
- 13. 创建可扩展枚举用于可扩展接口
- 14. 你可以扩展一个枚举吗?
- 15. 可扩展的枚举,而无需使用扩展
- 16. 扩展.NET MembershipCreateStatus枚举
- 17. 扩展和枚举常量
- 18. 扩展和枚举类型
- 19. 扩展枚举在C#
- 20. 扩展/惩戒枚举
- 21. 枚举扩展方法
- 22. 如果我可以扩展Java枚举,我会做X
- 23. 净可枚举扩展执行的行动并返回相同的枚举
- 24. 我可以typdef一个枚举是另一个typdef枚举的扩展吗?
- 25. 需要扩展类的枚举
- 26. 扩展HTML 5标签的HtmlTextWriterTag枚举
- 27. 将协议扩展限制为单枚举枚举
- 28. 枚举的枚举[JAVA]
- 29. 帮助创建枚举扩展帮助
- 30. 枚举扩展方法未显示
“枚举类型是一种特殊的数据类型,它使变量成为一组预定义的常量。”它在这里不再像是一个枚举:) – Zavior
enum用于枚举在编译时已修复且已知的常量。如果您在编译时有一些尚未熟知的数据(即,您不知道这些数据或期望它经常更改),那么枚举不可能是表示它的最佳方式。 – scottb
不,它不是xD – user2248702