java - 部分枚举建模

标签 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) == true;

在这种情况下,我似乎可以将 Specifier 建模为 enum,但问题是我无法初始化 new Specifier()

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

我可以在说明符中将其称为 public static final 字段 - 这是一种选择,但不确定这是否不如 enum 方法?

我可以让 enum 实现一个接口(interface),但这看起来太笨拙了。

对此还有其他想法吗?

最佳答案

似乎这种使用享元的实现看起来是最好的(因为我也可以使用 == 而不是 equals)

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

关于java - 部分枚举建模,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58133981/

相关文章:

java - 通过 https (Ubuntu 16.04) 设置 Nexus 3

C# 构造函数链接 : proper usage?

php - PHP 中 $variable->something 的故事是什么?

c++ - 我不明白 [dcl.enum]/4 与下面突出显示的 "enclosing enum specififer"相关的内容

java - 如何判断数据库是否已关闭或不可用?

java - JVM内存转储

PHP 面向对象 - 真实案例

java - 在枚举类型中使用整数

ruby - 获取多个数组中所有值的每个组合

java - 如何将 SOAP 响应与架构相匹配