Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何嵌套枚举_Java_Enums - Fatal编程技术网

Java 如何嵌套枚举

Java 如何嵌套枚举,java,enums,Java,Enums,我有一些UI客户端过滤器(组合框和复选框组)需要在服务器端使用:我想使用枚举来标识过滤器类型,其他枚举来标识每个过滤器的选项 // All UI filters public enum FilterType { AGGREGATION("aggregation"), AREA("area"), PRODUCTION("production"), DATA_TYPE("datatype"), PRODUCER("producer"), NETWOR

我有一些UI客户端过滤器(组合框和复选框组)需要在服务器端使用:我想使用枚举来标识过滤器类型,其他枚举来标识每个过滤器的选项

// All UI filters
public enum FilterType {
    AGGREGATION("aggregation"),
    AREA("area"),
    PRODUCTION("production"), 
    DATA_TYPE("datatype"),
    PRODUCER("producer"),
    NETWORK("network"),
    SOURCE("source");

    private String value;

    private FilterType(String value) {
        this.value = value;
    }

    public String getValue() {
        return value;
    }
}

// FilterType.AGGREGATION filter options
public enum AggregationOptionType {
    STANDARD("standard"),
    DTR("dtr"),
    CO("co");

    private String value;

    private AggregationOptionType(String value) {
        this.value = value;
    }

    public String getValue() {
        return value;
    }
}
我想在
FilterType.AGGREGATION
AggregationOptionType
之间建立一个硬链接,通过
FilterType.AGGREGATION.DTR
强制访问一个选项

如何将一个枚举“嵌套”到另一个枚举的值中? 是否有其他模式(可能比我的更聪明)可以达到同样的结果

编辑


澄清:我不需要为外部枚举的每个值指定一个公共内部枚举的值。我需要为外部枚举的每个值分配一个完全不同的内部枚举。

您可以将其作为变量添加到枚举中。 但前提是您可以将所有子枚举放在同一枚举类型下,即

public enum FilterType {
    AGGREGATION("aggregation",Subfilter.DTR);

}

只需像使用
字符串值一样使用它,如果您想要一个文件,请将枚举保存在接口类中:

public interface Enums {

    public enum FilterType {
        AGGREGATION("aggregation", AggregationOptionType.DTR),
        AREA("area"),
        PRODUCTION("production"),
        DATA_TYPE("datatype"),
        PRODUCER("producer"),
        NETWORK("network", AggregationOptionType.CO),
        SOURCE("source");

        public final String                value;
        public final AggregationOptionType type;

        private FilterType(String value, AggregationOptionType typy) {
            this.value = value;
            this.type = typy;
        }

        private FilterType(String value) {
            this.value = value;
            this.type = AggregationOptionType.STANDARD;
        }

    }

    public enum AggregationOptionType {
        STANDARD("standard"),
        DTR("dtr"),
        CO("co");

        public final String value;

        private AggregationOptionType(String value) {
            this.value = value;
        }
    }

}

您可以将一个枚举放入另一个枚举,如:

enum OuterEnum {
  A, B;    
  enum InnerEnum {
    C, D;
  }
}
如要使用:

class Enumuser {
  OuterEnum.InnerEnum ie = OuterEnum.InnerEnum.C; 
}
当然,这并不是你想要的。 您需要更进一步:

enum OuterEnum {
  A(InnerEnum.C), B(InnerEnum.D);

   private final InnerEnum inner;

   private OuterEnum(InnerEnum inner) { this.inner = inner; }

   public InnerEnum getInner() { return inner; }

  enum InnerEnum {
      C, D;
  }
}

class Enumuser {
  OuterEnum.InnerEnum inner = OuterEnum.A.getInner(); 
}
但最后一句警告:不要因为使用枚举来实现这些目的而挂断电话。你看,一旦你开始在切换这些枚举的地方写switch语句,为了做这个或那个。。。你可能做错了什么。请考虑<强>不>强>“掉进EnUM陷阱”。< /P>
相反,您应该研究如何使用多态性,如图所示

您可以执行如下操作:

//All UI filters
public interface FilterType {
     // FilterType.AGGREGATION
     public interface AGGREGATION {
          // FilterType.AGGREGATION filter options
        enum AggregationOptionType {
           STANDARD("standard"), 
           DTR("dtr"), 
           CO("co");

           private String value;

           private AggregationOptionType(String value) {
               this.value = value;
           }

           public String getValue() {
               return value;
           }
       }
    }
}

e、 g.对于聚合

只需在
FilterType
内部声明一个类型为
AggregationOptionType
的字段。最简单的方法是使用enums
标准聚合
DTR\U聚合
协同聚合
扩展
FilterType
,因为嵌套是不可能的。否则,您可以创建“普通”对象,可能使用单例设计模式,因为默认情况下枚举是单例的。通过这种方式,您将获得类型安全性和更大的灵活性。但是,
AggregationOptionType
仍然作为单独的枚举存在:如果我理解正确,我会链接将其包含在其
FilterType
选项中,
AggregationOptionType
仅适用于
FilterType.AGGREGATION
而不适用于
FilterType.AREA
或任何其他内容?
枚举提供不可修改的行为,但是如果你想将
FilterTypes
AggregationTypes
结合起来,我会在创建具体的过滤器对象时这样做:
新建过滤器(FilterType.AGGREGATION,AggregationOptionType.DTR)
我同意您关于多态性的看法,但在我的情况下,我只需要枚举,而不是将逻辑放在字符串
上。我认为您的答案是正确的:我如何将其概括为每个
OuterEnum
选项使用不同的
InnerEnum