使用Java在编译时生成枚举

时间:2019-03-07 05:55:09

标签: java enums

我有一个枚举Color,它具有约40种颜色:BLACKWHITERED

我有第二个枚举ColorListPreset,其中包含一堆Color的集合,例如PRIMARYSECONDARYALL,{{ 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类型的解决方案。

我想出的最好主意(尽管我还没有尝试实现)是仅列出名称中的ColorListPresetONLY_枚举,然后在构造函数中生成它们的集合通过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文件的语法糖。因此,这里有外力在起作用。

1 个答案:

答案 0 :(得分:1)

我建议您将ColorListPresetSet<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