Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 部分枚举模型_Java_Oop_Enums_Software Design - Fatal编程技术网

Java 部分枚举模型

Java 部分枚举模型,java,oop,enums,software-design,Java,Oop,Enums,Software Design,假设我有一个名为Specifier的字段,它可以是100个实例中的一个(这个数字将来可能会增加)。在代码中,我通常只使用其中的子集进行比较和逻辑 模拟这种行为的最佳方式是什么 Specifier s = new Specifier(123); Specifier s2 = Specifier.KNOWN; //KNOWN == Specifier(123) //possible comparation should be true since KNOWN can be 123 (s == s2

假设我有一个名为
Specifier
的字段,它可以是100个实例中的一个(这个数字将来可能会增加)。在代码中,我通常只使用其中的子集进行比较和逻辑

模拟这种行为的最佳方式是什么

Specifier s = new Specifier(123);
Specifier s2 = Specifier.KNOWN; //KNOWN == Specifier(123)

//possible comparation should be true since KNOWN can be 123
(s == s2) == true;
在这种情况下,我似乎可以将
说明符
建模为
枚举
,但问题是我无法初始化
新说明符()

我也可以在代码中表示所有100个枚举,但如果数据库中只有一个更改,我需要更新代码并重新编译

我可以在说明符中称为
publicstaticfinal
字段-这是一个选项,但不确定这是否不如
enum
方法

我可以用
enum
实现一个接口,但这似乎太笨拙了


关于这一点还有其他想法吗?

似乎这个带有flyweight的实现看起来是最好的(因为我也可以使用
=
而不是
equals

公共类说明符{
private static final Map flyweights=new HashMap();
公共静态最终说明符KNOWN1=说明符(1);
公共静态最终说明符KNOWN2=说明符(共“2”);
公共静态最终说明符KNOWN3=说明符(“3”);
静止的{
flyweights.put(KNOWN1.value(),KNOWN1);
flyweights.put(KNOWN2.value(),KNOWN2);
flyweights.put(KNOWN3.value(),KNOWN3);
}
私有最终字符串值;
的公共静态说明符(字符串值){
返回flyweights.computeIfAbsent(值,v->新说明符(值));
}
}

您的目标是什么。是否有一个类可以使用
==
或其他方法进行比较?此外,是否需要能够使用
new
获取实例?如果是,为什么?是的。假设我反序列化消息,其中说明符可以是100个cese中的任意一个。然后我比较它,只有当它等于说明符时,我才做一些逻辑。否则我只是重新序列化并转发。要点是能够与
=
进行比较,并使其具有与
相等的比较相同的“语义”吗?在这种情况下,我认为除了使用一个具有正确实现的
.equals
方法的常规类之外,没有太多的理由支持使用其他类。正如您所说,
KNOWN
可以是一个
静态final
变量。确保使用
KNOWN.equals(other)
而不是
KNOWN==other
检查是否相等。任何使用枚举的解决方案,或任何更复杂的解决方案,都会涉及到您跳出障碍使其工作(例如,绕过no
new
),而且从声音上看,除了构造和平等性检查之外,您没有任何要求。
public class Specifier {
  private static final Map<String, Specifier> flyweights = new HashMap<>();

  public static final Specifier KNOWN1 = Specifier.of("1");
  public static final Specifier KNOWN2 = Specifier.of("2");
  public static final Specifier KNOWN3 = Specifier.of("3");

  static {
        flyweights.put(KNOWN1.value(), KNOWN1);
        flyweights.put(KNOWN2.value(), KNOWN2);
        flyweights.put(KNOWN3.value(), KNOWN3);
  }

  private final String value;

  public static Specifier of(String value) {
    return flyweights.computeIfAbsent(value, v -> new Specifier(value));
  }
}