如何嵌套枚举

时间:2016-10-25 08:19:32

标签: java enums

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

SqlFunctions.PatIndex

我想在// 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访问选项。

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

修改

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

4 个答案:

答案 0 :(得分:1)

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

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语句,为了做到这一点或那样......你可能正在做一些错误的。请考虑“落入该枚举陷阱”。

相反,您应该考虑使用多态,如here所示!

答案 1 :(得分:0)

您可以将其作为变量添加到枚举中。 但是,只有你可以将所有子枚举置于相同的枚举类型下,即

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

}

答案 2 :(得分:0)

只需像String value一样使用它,如果你想拥有一个文件,那么把你的枚举保存在接口类中:

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;
        }
    }

}

答案 3 :(得分:0)

您可以执行以下操作:

//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。对于AGGREGATION