停止Java枚举中的重复
我在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
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);
}