我有一个枚举Color
,它具有约40种颜色:BLACK
,WHITE
,RED
等
我有第二个枚举ColorListPreset
,其中包含一堆Color
的集合,例如PRIMARY
,SECONDARY
,ALL
,{{ 1}},ONLY_WHITE
。我的问题与最后两个条目有关。
对于每个NOT_WHITE
,我希望Color
包含一个ColorListPreset
条目(大小为1的集合)和一个ONLY_
条目(大小为n-1的集合),例如NOT_
以外的所有Color
个广告)。今天我们只有几个WHITE
个条目正在使用,但每个NOT_
都需要一个。
当前,这些集合是由手工策划的,但是理想情况下,这两种类型可以从Color
枚举中自动生成,同时仍可以通过Color
以我的IDE识别的方式进行访问。
为争辩起见,说通过成员访问(例如ColorListPreset.NOT_WHITE
)访问这些值比维护集合的工作更为重要。
有没有办法做到这一点?纯Java解决方案是理想的。只要保持成员访问权限,都欢迎使用更改ColorListPreset.NOT_WHITE
类型的解决方案。
我想出的最好主意(尽管我还没有尝试实现)是仅列出名称中的ColorListPreset
和ONLY_
枚举,然后在构造函数中生成它们的集合通过NOT_
和this.name()
。我没有一个甚至生成枚举名称的概念。
当前代码示例:
Color.values()
public enum Color {
BLACK("black", "0x000000"),
GRAY("gray", "0x7f7f7f"),
WHITE("white", "0xffffff"),
RED("red", "0xff0000"),
GREEN("green", "0x00ff00"),
BLUE("blue", "0x0000ff");
// and so on...
}
public enum ColorListPreset {
NONE(Util.arrayListOf()),
ALL(Util.arrayListOf(Color.BLACK, Color.GRAY, Color.WHITE, Color.RED, Color.GREEN, Color.BLUE)),
GRAYSCALE(Util.arrayListOf(Color.BLACK, Color.GRAY, Color.WHITE)),
PRIMARY(Util.arrayListOf(Color.RED, Color.GREEN, Color.BLUE)),
ONLY_WHITE(Util.arrayListOf(Color.WHITE)),
NOT_WHITE(Util.arrayListOf(Color.BLACK, Color.GRAY, Color.RED, Color.GREEN, Color.BLUE));
// and so on...
}
基本上只是Util.arrayListOf(T... values)
的包装。
new ArrayList<T>(Arrays.asList(values))
枚举的一种动机是例如xml文件的语法糖。因此,这里有外力在起作用。
答案 0 :(得分:1)
我建议您将ColorListPreset
或Set<Color>
的{{1}}更改为某种“构建器”。它不应该是枚举。
List<Color>
用法示例:对于public class ColorListPreset {
public static Set<Color> only(Color color) {
return EnumSet.of(color);
}
public static Set<Color> not(Color color) {
return EnumSet.complementOf(EnumSet.of(color));
}
// methods that return other color sets...
}
,您将编写ColorListPreset.NOT_WHITE
。