如何在Enum中分解出常见参数?

时间:2018-06-06 15:20:45

标签: java enums

此处,Enum1,Enum2和Enum3共享same列表。如何分解他们共享的这个共同代码?

public enum EnumQ {

    Enum1 ("A", 1, Arrays.asList("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k")),
    Enum2 ("B", 1, Arrays.asList("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k")),
    Enum3 ("C", 1, Arrays.asList("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k"));

    private final String foo;
    private final int bar;
    private final List<String> list;

    private EnumQ(
        final String foo, final int bar, final List<String> list) {
        this.foo = foo;
        this.bar = bar;
        this.list = list;
    }
}

2 个答案:

答案 0 :(得分:2)

您可以创建嵌套枚举。

public enum EnumQ {
    Enum1 ("A", 1, ListEnum.A_TO_K),
    Enum2 ("B", 1, ListEnum.A_TO_K),
    Enum3 ("C", 1, ListEnum.A_TO_K);

    private final String foo;
    private final int bar;
    private final ListEnum list;

    private EnumQ(
            final String foo, final int bar, final ListEnum list) {
        this.foo = foo;
        this.bar = bar;
        this.list = list;
    }

    private enum ListEnum {
        A_TO_K(Arrays.asList("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k"));
        private final List<String> list;

        private ListEnum(List<String> list) {
            this.list = list;
        }
    }
}

当您移动到嵌套枚举(此处为列表)中的数据表示某个独立(可重用)实体/对象时,这更有意义。

答案 1 :(得分:2)

您可以将其提取为常量。但是,因为它是枚举,所以您无法在EnumQ中创建常量。这可以通过使用嵌套的私有类来解决。此外,您应该使此列表不可变。

public enum EnumQ {

    Enum1("A", 1, Constants.STRINGS),
    Enum2("B", 1, Constants.STRINGS),
    Enum3("C", 1, Constants.STRINGS);

    private final String foo;
    private final int bar;
    private final List<String> list;

    EnumQ(String foo, int bar, List<String> list) {
        this.foo = foo;
        this.bar = bar;
        this.list = list;
    }

    private static class Constants {
        private static final List<String> STRINGS = unmodifiableList(asList("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k"));
    }
}