返回枚举值或使用布尔getter

时间:2018-03-20 14:08:59

标签: java oop enums getter

我有一个问题可能是一个纯粹的品味问题,但我只想从不同的角度得到一些意见,以便更清楚地了解这一点。

类从数据库读取和写入状态值。目前有5个状态值,它们可能会变得更多。为简洁起见,我在示例中仅使用3个状态值。此外,虽然这是Java代码,但该概念也可以转移到其他语言。

class Status {
  private enum Value { FAILED, FINISHED, RUNNING }

  // getters (read from db)
  // ...
  // setters (write into db)
  // ...
}

我无法决定是否应该使用像

这样的通用getter和setter
Value get()

void set(Value value)

或者我是否应该创建具有更多语义的特定getter和setter,如

boolean isRunning()
boolean hasFailed()
boolean hasFinished()  // could also be named isFinished()...

void setFailed()
void setFinished()
void setRunning()

该组件对性能不是很重要,但语义getter的明显缺点是您需要对if-else if语句进行多次数据库读取,并且switch不能使用。if (status.get() == Status.Value.RUNNING) { ... } 。另一方面,它隐藏了消费者的实现的内部细节,并且不需要使用此类之外的枚举值:

if (status.isRunning()) { ... }

VS

{{1}}

感谢任何评论。

2 个答案:

答案 0 :(得分:2)

如果客户必须多次进行比较,例如:

if (status.get() == Status.Value.RUNNING) { ... }

您可能会为Status类中包含的枚举字段提供过多细粒度的API 它将强制每个客户端具有重复的代码或以其他方式创建自己的util方法,例如boolean isRunning(Status status){return status.get() == Status.Value.RUNNING}

出于两个原因,这不是一个好主意:

  • 锅炉板代码必须位于API的内部/实现中,而不是客户端。
  • 方法必须位于最适合持有它的类中。在这种情况下,这是Status。不要限制客户端类来承担此方法的责任。

请注意,您不应同时提供:值getter / setter +特定方法。这可能会产生误导。

答案 1 :(得分:1)

我同意梅纳认为这是基于意见的,我更喜欢使用isRunning,hasFailed等。 因为名字具有更多意义,而且更短,更容易理解。

正如你所写:

if (status.get() == Status.Value.RUNNING) { ... }

if (status.isRunning()) { ... }

第二个选项更短,可以更好地了解正在发生的事情,但这又是个人的事情。

此外,您可以考虑使用更多功能方法,类似于Optional,例如ifFailed(Consumer<Throwable>)