我有一个问题,可能是纯粹的品味问题,但我只是想从不同角度获得一些意见,以便对此更加清楚。
类从数据库读取状态值并将其写入数据库。目前有 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()) { ... }
欢迎任何评论。
最佳答案
如果客户端必须编写多次比较,例如:
if (status.get() == Status.Value.RUNNING) { ... }
您可能为 Status
中包含的枚举字段提供了太多细粒度的 API类。
它将强制每个客户端拥有重复的代码或以其他方式创建自己的 util 方法,例如 boolean isRunning(Status status){return status.get() == Status.Value.RUNNING}
。
这不是一个好主意,原因有两个:
- 样板代码必须位于 API 的内部/实现中,而不是位于客户端。
- 方法必须位于最适合容纳它的类中。在本例中,这是
Status
。不要限制客户端类承担此方法的责任。
请注意,您不应同时提供:值 getter/setter + 特定方法。这可能会产生误导。
关于java - 返回枚举值或使用 boolean 值 getter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49386493/