枚举数组/列表值

J. *_* K. 4 java enums

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 });
}
Run Code Online (Sandbox Code Playgroud)

而不是这个,我希望有一个带有两个字段的预定义枚举 - REQUIRED_FIELDS_FOR_DELIVERABLE_PRODUCTSREQUIRED_FIELDS_FOR_DOWNLOADABLE_PRODUCTS

我知道enums的理论,但我从来没有使用它们,所以我无法弄清楚如何做到这一点.

或者也许是通过传递"isProductDeliverable"布尔值来获取所需字段并获取正确的字段数组的方法?

Ted*_*ddy 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

进一步改进:

在上面的代码中,fields属性仍然是可变的.有人可以做到REQUIRED_FIELDS_FOR_DELIVERABLE_PRODUCTS.getFields().add(..)这一点会击败enum最初的目的.

构造函数的更好实现是:

private RequiredFields(String... fields){
    this.fields = ImmutableList.copyOf(fields); //com.google.common.collect.ImmutableList
}
Run Code Online (Sandbox Code Playgroud)