具有 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_PRODUCTSREQUIRED_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; 希望这能清除您的理解。