如何嵌套枚举

3

我有一些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.AGGREGATIONAggregationOptionType之间创建一个硬链接,强制通过FilterType.AGGREGATION.DTR访问选项。如何将一个枚举嵌套到另一个枚举的值中?是否有其他模式(可能比我更聪明)可以达到同样的结果?
编辑:澄清一下,我不需要为外部枚举的每个值分配内部枚举的共同值。我需要为外部枚举的每个值分配一个完全不同的内部枚举。

最简单的方法是通过在FilterType中扩展枚举类型STANDARD_AGGREGATIONDTR_AGGREGATIONCO_AGGREGATION,因为嵌套不可行。否则,您可以创建“普通”对象,可能使用单例设计模式 - 因为枚举默认是单例的。这样,您将获得类型安全性和更多的灵活性。 - Smutje
但是 AggregationOptionType 仍然作为单独的枚举存在:我想将其包含在其 FilterType 选项中。 - Marco Stramezzi
如果我理解正确,AggregationOptionType 只适用于 FilterType.AGGREGATION 而不是 FilterType.AREA 或其他任何类型? - Smutje
enums provide unmodifiable behavior, but IFAIU you want FilterTypes beeing combined with AggregationTypes I'd do this when creating a concrete filter Object: new Filter(FilterType.AGGREGATION, AggregationOptionType.DTR); - Timothy Truckle
@Smutje:是的,你说得对。 - Marco Stramezzi
显示剩余2条评论
4个回答

2
你可以将一个枚举放入另一个枚举中,例如:
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 语句以切换此类枚举,以执行这个或那个操作......那么您可能正在做某些错误的事情。请考虑避免“陷入该枚举陷阱”。

相反,您应该考虑使用多态,就像这里所示!


我同意你关于多态性的看法,但在我的情况下,我只需要枚举而不是将逻辑放在字符串“value”上。我认为你的答案是正确的方向:我该如何将其推广到为每个“OuterEnum”选项设置不同的“InnerEnum”? - Marco Stramezzi

0

你可以将它作为变量添加到枚举中。 但前提是你必须将所有的子枚举放在同一枚举类型下

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

}

0

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

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

}

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

例如聚合


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接