具有 array/list 个值的枚举
Enum with array/list values
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" 布尔值并获取正确的字段数组来请求必填字段的方法?
枚举可以有很像 类 的数据和行为。像这样的东西应该有用...
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
}
要创建不可变的对象列表,从 Java 9 开始,您可以使用 List.of 静态方法。所以你可以创建类似的东西:
Enum1("a","b"),
Enum2("c","d")
private String fields;
EnumClassName(String...args) {
this.fields = List.of(args);
}
}
在调用方法中你可以这样调用
list = Enum1.fields;
希望这能清除您的理解。
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" 布尔值并获取正确的字段数组来请求必填字段的方法?
枚举可以有很像 类 的数据和行为。像这样的东西应该有用...
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
}
要创建不可变的对象列表,从 Java 9 开始,您可以使用 List.of 静态方法。所以你可以创建类似的东西:
Enum1("a","b"),
Enum2("c","d")
private String fields;
EnumClassName(String...args) {
this.fields = List.of(args);
}
}
在调用方法中你可以这样调用
list = Enum1.fields;
希望这能清除您的理解。