停止Java枚举中的重复

停止Java枚举中的重复,java,enums,Java,Enums,我在Java类中有以下enum: public enum Resolution { RES_32 (32), RES_64 (64); private final int asInt; private Resolution(int asInt) { this.asInt = asInt; } }; 我有更多的类需要类似的enum,它们具有相同的asInt属性和相同的构造函数,但具有不同的常量。因此,在另一个类中,我需要以下enum: pu

我在Java类中有以下
enum

public enum Resolution {
    RES_32 (32),
    RES_64 (64);
    private final int asInt;
    private Resolution(int asInt) {
        this.asInt = asInt;
    }
};
我有更多的类需要类似的
enum
,它们具有相同的
asInt
属性和相同的构造函数,但具有不同的常量。因此,在另一个类中,我需要以下
enum

public enum Resolution {
    RES_32 (32),
    RES_64 (64),
    RES_128 (128);
    private final int asInt;
    private Resolution(int asInt) {
        this.asInt = asInt;
    }
};

如果这是一个类,我可以使用继承来避免在构造函数中重复代码(并且可能会为该
asInt
属性制作一个getter)。每次我需要这样一个
解析
enum
,我该怎么做才能停止重复我自己?理想情况下,我只想为每个
解析指定常量,并保留构造函数和属性。

我会将新值添加到原始枚举中,让新类重新使用它。为什么他们不能打电话给你发的第一个?如果复制并扩展了第一个构造函数,那么除了重复构造函数之外,还有更大的问题。

为什么不将枚举从类中取出,创建一个独立的枚举文件,只使用第二个(具有RES_128的)进行所有处理

编辑1
您的评论:


因为不是所有的类都应该有相同的常量。有些只需要32和64,而有些则需要32、64和128

实际上只有一个解析“类型”,这表明应该只有一个解析枚举,但问题似乎是并非所有类都接受所有解析。一种可能的解决方案是使用一个枚举来表示所有的分辨率,但对不同的类使用EnumMap,有些类将分辨率标记为false或表示对该类无效

编辑2
甚至只需要一组接受的枚举

编辑3
e、 例如,使用HashSet

class Foo002 {
   public static Set<Resolution> allowedResolution = new HashSet<Resolution>();
   static {
      allowedResolution.add(Resolution.RES_32);
      allowedResolution.add(Resolution.RES_64);
   }
   private Resolution resolution;

   public void setResolution(Resolution resolution) {
      if (!(allowedResolution.contains(resolution))) {
         throw new IllegalArgumentException("Disallowed Resolution: " + resolution);
      }
      this.resolution = resolution;
   }
}

enum Resolution {
   RES_32 (32),
   RES_64 (64),
   RES_128 (128);
   private final int asInt;
   private Resolution(int asInt) {
       this.asInt = asInt;
   }

   public int getIntValue() {
      return asInt;
   }
};
class Foo002{
public static Set allowedResolution=new HashSet();
静止的{
允许决议添加(决议第32号决议);
允许决议添加(决议64);
}
非公开决议;
公开决议(决议){
如果(!(allowedResolution.contains(resolution))){
抛出新的IllegalArgumentException(“不允许的决议:”+决议);
}
这个决议=决议;
}
}
枚举解析{
第32(32)号决议,
第64(64)号决议,
决议128(128);
私人终审法院;
非公开决议(国际){
this.asInt=asInt;
}
public int getIntValue(){
返回asInt;
}
};

以下内容允许您在运行时使用枚举,这是参考链接:

在这方面可能会有所帮助。鉴于以下情况

public enum Resolution {

    RES_32(32),
    RES_64(64),
    RES_128(128),
    RES_256(256);

    public static Set<Resolution> deluxe = EnumSet.allOf(Resolution.class);
    public static Set<Resolution> typical = EnumSet.range(RES_64, RES_128);
    public static Set<Resolution> ecomomy = EnumSet.of(RES_32);

    private final int asInt;

    private Resolution(int asInt) {
        this.asInt = asInt;
    }
};

因为此枚举表示所有可能的
分辨率
s。对于一个类,您只能有
RES_32
RES_64
,而对于其他类,您也可以有
RES_128
。重用枚举并让每个类强制执行其自身的不变量。1+Yup。所有类的常量都是一样的,只是允许的不同。因为不是所有类都应该有相同的常量。有些只需要32和64,有些则需要32、64和128。@Radu:请参见上面的编辑1。装满鳗鱼的气垫船:听起来不错,你能给我举个例子吗?@Radu:
你能给我举个例子吗?
:“这留给读者作为练习”。说真的,虽然这并不难,而且非常类似于散列图。气垫船上满是鳗鱼:谢谢你,但我完全不知道
EnumMap
HashSet
如何解决我的问题,搜索也没有帮助。这听起来像是一个危险的乱码,现在可能可以工作,但如果JVM发生变化,就会失败。如果您想要一个可变的实例集合,最好使用类。更新以反映接口优先于实现。
public enum Resolution {

    RES_32(32),
    RES_64(64),
    RES_128(128),
    RES_256(256);

    public static Set<Resolution> deluxe = EnumSet.allOf(Resolution.class);
    public static Set<Resolution> typical = EnumSet.range(RES_64, RES_128);
    public static Set<Resolution> ecomomy = EnumSet.of(RES_32);

    private final int asInt;

    private Resolution(int asInt) {
        this.asInt = asInt;
    }
};
for (Resolution r : Resolution.deluxe) {
    System.out.println(r.asInt);
}