【问题标题】:Enum with some repeated values?带有一些重复值的枚举?
【发布时间】:2016-12-29 11:57:14
【问题描述】:

我有一个枚举,它将某些类型和每种类型的某些字段放在一起。

public enum Types {

A (1, A.class, "stringA" ), 
B (2, B.class, "stringB" ), 
C (3, C.class, "stringC" ),

C1(3, C1.class, "stringC" ),
C2(3, C2.class, "stringC" ),
C3(3, C3.class, "stringC" ),
.
.
D (4, D.class, "stringD" ),
E (5, E.class, "stringE" ),
F (6, F.class, "stringF" ),
.
.
.
.
private int type;
private Class<?> className;
private String longname;

private Types(int type, Class<?> className, String longName ) 
    {
        this.type = type;
        this.className = className;
        this.longName = longName;
    }

//..... getter, setters
// returns name from type passed
   public static Types getName(int type) {

        for (Types e : Types.values()) {
            if (type == e.type)
                return e;
        }

        return null;
    }
}

现在一切都很好,直到没有重复的类型键。所以TypeC 具有子类型C1, C2..,因此具有与3 相同的类型值。

它有一个方法getName(),它通过迭代枚举的values 来给出类型。

现在C1, C2, C3... 都映射到相同的类型值 3。

现在为了区分 C 类型,我有另一个变量名称 definition 仅用于 C 子类型。所以definition 的值是:

C1 100
C2 101
C3 101

所以要检索类型 C 的枚举的唯一元素,我需要两个值 typedefinition

我想到了两种方法:

要么为整个枚举添加一个名为 definition 的新字段,因此这将导致除 C 之外的其他类型为空值。

或者为 C 子类型创建一个新枚举并使用该枚举来获取 C 子类型名称,而不是从 getName() 获取。

如何以最好的方式实现这一目标?

感谢任何帮助。

【问题讨论】:

  • 我建议你用你的定义字段替换类型字段,让 A 有 100,B 有 200,等等,因为你可能想要 A1、A2、G7、Z9 - 好吧,不是真的,但是为了可扩展性,完全用定义替换类型总是更好,除非你正在升级一个广泛使用的库。
  • 我建议您将方法重命名为“Types getName(int type)”。您能否添加一些 javadoc,以便我们了解该方法的作用?是不是类似于“Types getByTypeKey(int typeKey)”?
  • @TobiasOtto:是的,它是getByTypeKey(int typeKey)。 1-->A型,2-->B型,3-->C型

标签: java enums


【解决方案1】:

这取决于您的Cx 枚举是否真的与AB 等属于同一类。如果不知道您的域模型,就无法回答这个问题。

仅从语法来看,我可能会让Types 包含definitiontype 字段,definition 是主键。然后是两个构造函数,一个同时具有definitiontype,另一个仅具有definitiontype 被赋予与definition 相同的值)。这基本上是您对两个字段的建议,但对于非Cx,而不是null,只需考虑definition 等于type

【讨论】:

  • A、B、C、D是不同的类型,C1、C2..属于C类型。而definition属性仅适用于Cx类型,因此不能为类型分配相同的值作为定义。你能举例说明两个构造函数是如何工作的吗?
猜你喜欢
  • 2017-03-25
  • 2019-07-18
  • 2012-08-31
  • 2018-05-12
  • 2016-03-05
  • 1970-01-01
  • 2019-02-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多