使用枚举的序数是好的做法吗?

2022-09-01 00:16:22

我有一个枚举:

public enum Persons {

    CHILD,
    PARENT,
    GRANDPARENT;

}

使用方法检查枚举成员之间的“层次结构”是否存在问题?我的意思是 - 当使用它排除冗长时,当有人将来可以意外地改变顺序时,是否有任何缺点。ordinal()

还是做这样的事情更好:

public enum Persons {

    CHILD(0),
    PARENT(1),
    GRANDPARENT(2);

    private Integer hierarchy;

    private Persons(final Integer hierarchy) {
        this.hierarchy = hierarchy;
    }

    public Integer getHierarchy() {
        return hierarchy;
    }

}

答案 1

TLDR:不,你不应该!

如果您引用 javadoc 中的方法:ordinalEnum.java

大多数程序员对这种方法毫无用处。它旨在供复杂的基于枚举的数据结构使用,例如 和 。java.util.EnumSetjava.util.EnumMap

首先 - 阅读手册(在本例中为 javadoc)。

其次 - 不要写脆弱的代码。枚举值将来可能会更改,您的第二个代码示例更加清晰可维护

您绝对不希望在 和 之间插入一个新的枚举值(比如说),则为将来带来问题。PARENTGRANDPARENT


答案 2

正如Joshua Bloch在 Effective Java 中所建议的那样,从枚举的序数派生与枚举关联的值不是一个好主意,因为对枚举值顺序的更改可能会破坏您编码的逻辑。

您提到的第二种方法完全遵循作者的建议,即将值存储在单独的字段中。

我想说的是,您建议的替代方案肯定更好,因为它更具可扩展性和可维护性,因为您正在将枚举值的顺序与层次结构的概念解耦。