【问题标题】:Should you include unknown/default value in java enums您是否应该在 java 枚举中包含未知/默认值
【发布时间】:2013-01-08 02:00:11
【问题描述】:

对于最佳实践,是否最好使用下面的代码和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";
}

【问题讨论】:

  • 你怎么会有一个未知的值?也就是说,它怎么会到return "red";这一行呢?
  • @DanielKaplan, shape 正在从另一个服务传入,因此它可能为空。并且颜色将用作网页显示的一部分,因此我们希望使用默认值而不是 500'ing
  • 哦,我明白了,我看错了你的例子。我以为getShapeColor() 在枚举中。

标签: java coding-style enums


【解决方案1】:

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

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

最好的解决方案确实是有一个未知的值:

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

    UNKNOWN("unknown");

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

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

注意:因为枚举代表常量,所以约定是给它们加上下划线的大写名称。

【讨论】:

    【解决方案2】:

    据推测,如果形状变量未知,它将为 null,所以我会选择将实例传递给的静态方法

    public static String getShapeColor(Shape shape) {
        if(shape != null) {
            return shape.color;
        }
        return "red";
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-13
      • 1970-01-01
      • 2011-03-10
      • 2011-10-27
      • 2018-05-17
      • 1970-01-01
      • 2021-06-10
      • 2021-08-23
      相关资源
      最近更新 更多