java - 具有数组/列表值的枚举

标签 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 });
}

取而代之的是,我想要一个包含两个字段的预定义枚举 - REQUIRED_FIELDS_FOR_DELIVERABLE_PRODUCTSREQUIRED_FIELDS_FOR_DOWNLOADABLE_PRODUCTS

我知道枚举的理论,但我从未使用过它们,所以我不知道如何做到这一点。

或者也许是一种通过传递此“isProductDeliverable” boolean 值并获取正确的字段数组来请求必填字段的方法?

最佳答案

枚举可以像类一样拥有数据和行为。像这样的东西应该工作...

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 - 具有数组/列表值的枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28657579/

相关文章:

java - 使用 GLES20 通过 Android 插件获取位图到 Unity

java - 如何确保枚举的状态特定于一个实例

java - 如何在枚举中添加特殊字符?

python - 移植 C 定义了 Pythonic 方式

java - 没有这样的字段错误: MARGIN using ZXing library

java - 使用 Hibernate 获取 Collection<Long> 值时出现异常 - ClassCastException : java. math.BigDecimal 无法转换为 java.lang.Long

java - 使用文件 ..xml 中定义的名称 '..' 创建 bean 时出错

java - Proguard 混淆导致 java.lang.IllegalArgumentException : class declares multiple JSON fields named "a"

c# - 将字符串属性限制为一组预定义的值(枚举中没有连字符的解决方法)

c# - 为什么我们不能有 "char"枚举类型