当前位置:  开发笔记 > 编程语言 > 正文

我可以在Java中在运行时添加和删除枚举元素

如何解决《我可以在Java中在运行时添加和删除枚举元素》经验,为你挑选了4个好方法。

可以在运行时从Java中的枚举中添加和删除元素吗?

例如,我可以从文件中读取枚举的标签和构造函数参数吗?


@saua,这只是一个问题,它是否真的可以完成.我希望有一些改变运行字节码的巧妙方法,可能使用BCEL或其他东西.我也跟进了这个问题因为我意识到我不确定何时应该使用枚举.

我非常确信,如果我希望能够在运行时安全地更改内容,那么正确的答案是使用一个确保唯一性而不是枚举的集合.



1> Tom Hawtin -..:

不,枚举应该是一个完整的静态枚举.

在编译时,您可能希望从某种类型的另一个源文件生成枚举.java文件.你甚至可以像这样创建一个.class文件.

在某些情况下,您可能需要一组标准值但允许扩展.通常的方法是使用interface接口和enum实现interface标准值的接口.当然,switch当你只有一个参考时,你就失去了能力interface.



2> Yuval..:

在窗帘后面,枚举是具有私有构造函数的POJO和枚举类型的一组公共静态最终值(参见此处的示例).事实上,直到Java5,以这种方式构建自己的枚举被认为是最佳实践,Java5将该enum关键字作为简写引入.请参阅Enum 的来源以了解更多信息.

因此,使用公共静态最终常量数组编写自己的"TypeSafeEnum"应该没有问题,这些常量由构造函数读取或传递给它.

另外,请自己帮忙并覆盖equals,hashCode并且toString,如果可能的话,创建一个values方法

问题是如何使用这样的动态枚举...你不能从文件中读取值"PI = 3.14"来创建enum MathConstants然后继续使用MathConstants.PI你想要的任何地方......


集合和数组都是可变对象(和"对象").拥有"最终"数组只意味着您不会调整大小或重新分配数组,但它仍然允许您替换已经适合其边界的值.

3> Andy..:

我需要做这样的事情(用于单元测试),我遇到了这个 - EnumBuster:http: //www.javaspecialists.eu/archive/Issue161.html

它允许添加,删除和恢复枚举值.

编辑:我刚刚开始使用它,并发现java 1.5需要进行一些细微的更改,我目前仍然坚持:

添加数组copyOf静态助手方法(例如,采用以下1.6版本:http://www.docjar.com/html/api/java/util/Arrays.java.html)

将EnumBuster.undoStack更改为堆栈

在undo()中,将undoStack.poll()更改为undoStack.isEmpty()?null:undoStack.pop();

对于我迄今为止尝试的java 1.5枚举,字符串VALUES_FIELD需要为"ENUM $ VALUES"



4> moffdub..:

我在我年轻的职业生涯的形成项目中遇到了这个问题.

我采用的方法是在外部保存枚举的值和名称,最终目标是能够编写尽可能接近语言枚举的代码.

我希望我的解决方案看起来像这样:

enum HatType
{
    BASEBALL,
    BRIMLESS,
    INDIANA_JONES
}

HatType mine = HatType.BASEBALL;

// prints "BASEBALL"
System.out.println(mine.toString());

// prints true
System.out.println(mine.equals(HatType.BASEBALL));

我最终得到了这样的东西:

// in a file somewhere:
// 1 --> BASEBALL
// 2 --> BRIMLESS
// 3 --> INDIANA_JONES

HatDynamicEnum hats = HatEnumRepository.retrieve();

HatEnumValue mine = hats.valueOf("BASEBALL");

// prints "BASEBALL"
System.out.println(mine.toString());

// prints true
System.out.println(mine.equals(hats.valueOf("BASEBALL"));

由于我的要求是必须能够在运行时向枚举添加成员,我还实现了该功能:

hats.addEnum("BATTING_PRACTICE");

HatEnumRepository.storeEnum(hats);

hats = HatEnumRepository.retrieve();

HatEnumValue justArrived = hats.valueOf("BATTING_PRACTICE");
// file now reads:
// 1 --> BASEBALL
// 2 --> BRIMLESS
// 3 --> INDIANA_JONES
// 4 --> BATTING_PRACTICE

我称它为动态计数"模式",以及你阅读的原创设计和它的修订版.

两者之间的区别在于修订后的版本是在我真正开始研究OO和DDD之后设计的.我在设计名义上是程序性DDD的时候设计的第一个,时间压力不小于此.

推荐阅读
罗文彬2502852027
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有