是否应在java枚举中包含未知/默认值

jb.*_*jb. 5 java enums coding-style

对于最佳实践,使用return "red"模拟未知值的代码是否更好?或者我应该添加一个unknown("red")选项return Shape.unknown.color;吗?关于未知值的枚举是否有标准的Java约定?

private enum Shape {
    triangle("yellow"),
    square("green"),
    circle("red");

    private final String color;
    Shape(String color) {
        this.color = color;
    }
};

public String getShapeColor() {
    if(shape != null) {
        return shape.color;
    }
    return "red";
}
Run Code Online (Sandbox Code Playgroud)

Jac*_*ack 9

枚举是一种隐含的变量,它不应该具有未初始化的值.

实际上你的推理对于每种变量都是正确的,而不仅仅是枚举,但是在枚举的特定情况下,你声明了一个可以具有有限数量的可能值的类型,所以null不应该是一个选项.

最佳解决方案确实具有未知价值:

private enum Shape {
    TRIANGLE("yellow"),
    SQUARE("green"),
    CIRCLE("red"),

    UNKNOWN("unknown");

    private final String color;
    Shape(String color) {
        this.color = color;
    }
};
Run Code Online (Sandbox Code Playgroud)

并初始化每个Shape类型的变量,Shape.UNKNOWN以避免进行任何空检查,这是一种空设计模式.使用枚举时,这种模式更有意义.

注意:由于枚举表示常量,因此约定是为它们提供带下划线的大写名称.