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