if (isProductDeliverable) {
REQUIRED_FIELDS = Arrays.asList(new String[] { Fields.NAME, Fields.EMAIL, Fields.ADDRESS });
} else {
REQUIRED_FIELDS = Arrays.asList(new String[] { Fields.NAME, Fields.EMAIL });
}
而不是这个,我希望有一个包含两个字段的预定义枚举 - REQUIRED_FIELDS_FOR_DELIVERABLE_PRODUCTS
和REQUIRED_FIELDS_FOR_DOWNLOADABLE_PRODUCTS
我知道枚举理论,但我从未使用它们,所以我无法弄清楚如何做到这一点。
或许可以通过传递“isProductDeliverable”布尔值来获取所需字段并获取正确的字段数组?
答案 0 :(得分:9)
枚举可以像类一样拥有数据和行为。这样的事情应该有用......
public enum RequiredFields {
REQUIRED_FIELDS_FOR_DELIVERABLE_PRODUCTS( Fields.NAME, Fields.EMAIL, Fields.ADDRESS ),
REQUIRED_FIELDS_FOR_DOWNLOADABLE_PRODUCTS( Fields.NAME, Fields.EMAIL );
private List<String> fields;
private RequiredFields(String... fields){
this.fields = Arrays.asList(fields);
}
public List<String> getFields(){
return fields;
}
}
进一步改善:
在上面的代码中,fields
属性仍然是可变的。有人可以做REQUIRED_FIELDS_FOR_DELIVERABLE_PRODUCTS.getFields().add(..)
,这将首先击败enum
的全部目的。
构造函数的更好实现是:
private RequiredFields(String... fields){
this.fields = ImmutableList.copyOf(fields); //com.google.common.collect.ImmutableList
}
答案 1 :(得分:0)
为了创建不可变的对象列表,从 Java 9 开始,您可以使用 List.of 静态方法。所以你可以创建类似的东西:
Enum1("a","b"),
Enum2("c","d")
private String fields;
EnumClassName(String...args) {
this.fields = List.of(args);
}
}
在调用方法中,您可以像这样调用
list = Enum1.fields;
希望这能帮助您理解。