【发布时间】:2011-08-22 07:56:18
【问题描述】:
当您为接口中可能“未定义”的事物定义枚举时,您应该
- 为此定义一个单独的枚举值,或者
- 在这些情况下只使用 enumValue = null 吗?
例如,
serviceX.setPrice(Price priceEnum)
enum Price {
CHEAP, EXPENSIVE, VERRRY_EXPENSIVE, UNKNOWN
}
和 priceEnum.UNKNOWN 在需要时
或
enum Price {
CHEAP, EXPENSIVE, VERRRY_EXPENSIVE
}
需要时 priceEnum = null?
对此进行了一些辩论。想到的几点:
- 使用 Price.UNKNOWN 可以节省一些“if (price == null)”代码。您可以在单个 switch-case 中处理 Price x 的所有值
- 根据视图技术,本地化 Price.UNKNOWN 可能更容易
- 使用 Price.UNKNOWN 会导致代码中出现“幻数”问题,IMO。这里有 Price.UNKNOWN,其他地方可能有 Color.UNDEFINED、Height.NULLVALUE 等
- 使用 priceValue = null 与 Java 中其他数据类型的处理方式更加一致。对于未知值,我们也有 Integer i = null、DomainObject x = null、String s = null,不是吗?
- Price.UNKNOWN 强制您决定是否对所有用例普遍允许空值。我们可能有方法 Price getPrice() 可能返回 Price.UNKNOWN 和 setPrice(Price p) 不允许接受 Price.UNKNOWN。由于 Price.UNKNOWN 总是包含在枚举值中,因此这些接口看起来有点不干净。我知道 priceValue = null 有同样的问题(你不能在界面中定义 null 是否被接受)但感觉更干净一点,误导性更小(?)
【问题讨论】:
-
你不能在 switch 中使用
null,这是一个主要的缺点。 -
大家好。减轻空值处理的负担,以及更具体地了解“空值”的含义的能力是 Price.UNKNOWN 的优点。此外,关于“空对象模式”的好点,它使 Price.UNKNOWN 感觉像是更“有效”和普遍接受的解决方案。但是,没有人对 Price.UNKNOWN 的负面影响有同样的感受?我觉得 Price.UNKNOWN 污染了枚举的值集。在 showAllPrices() 中说,我不能再枚举所有枚举值,我必须添加 if (!Price.UNKNOWN),这感觉有点脏和“幻数”。
-
@user449236:如果您不喜欢检查这个特殊值,请为每个枚举添加一个
display标志并改为检查它。更清洁、更灵活。 -
看,这很简单,以 C 为例,枚举不能有 null(因为它们实际上是真正的 int)。在我的理解中,有一个未声明的值(即 null)是一种不好的做法,通常是一个错误。未声明的值不能说明目的是什么,即它应该被跳过,它是错误的结果(因此应该抛出异常)
-
对此的(很晚)输入。根据我的经验 - 如果您正在编写要重用、扩展或构成 API 一部分的代码 - 您将不得不考虑客户端代码传递或无论如何设置 null 以保持健壮。这通常会减轻特殊 Foo.NIL 值带来的任何好处。这也使得编写与类型无关的方法/实用程序变得更加困难,因为它们(通常)不会知道其中一个值是“特殊的”。