【发布时间】:2021-03-11 21:06:20
【问题描述】:
所以我在设计课程时经常遇到这种情况:
class foo {
private Bar bar;
public foo(Bar bar) {
this.bar = bar;
}
public Bar getBar() {
return bar;
}
public void setBar(Bar bar) {
this.bar = bar;
}
}
到目前为止,一切都很好,对吧?但后来我想“我怎么知道用户会传递一个可接受的bar 对象?那么:
private bool validateBar(Bar bar) {
return amIgood(bar);
}
好吧,我当然需要像这样把它和setBar 函数放在一起:
public bool setBar(Bar bar) {
if (validateBar(bar)) {
this.bar = bar;
return true;
}
else
return false;
}
好吧,如果这是我需要做的,那么我也必须包含在构造函数中,对吧?除了构造函数没有返回 foo 对象以外的任何选项,所以我尝试考虑解决方法,如下所示:
public foo(Bar bar) {
if validateBar(bar)
this.bar = bar;
else
throw Exception("Invalid bar passed along to foo");
}
或者:
public foo(Bar bar) {
if (!setBar(bar))
throw Exception("Invalid bar passed along to foo");
}
您可以看到一些简单的事情很快就失控了。如果在验证的基础上还要进行某种卫生处理,那就更糟了。
所以我的问题是如何在保持类结构相对简单的同时解决验证问题?
编辑
setbar 的第一个示例应该是 void,但不小心放了 bar,现已更正
【问题讨论】:
-
"类的“set”方法应该返回“void”还是“boolean”?” - 它们应该返回
this!</opinion>如果参数不合法,为什么不抛出IllegalArgumentException呢?如果设置器有一些逻辑,即必须进行一些验证,那么它不应该是设置器,而是validateAndSet...(...)(或等效)。 -
@Turing85 我非常不同意你的
validateAndSet...(...)想法。如果您无法向 setter 添加验证,那么它们的意义何在? -
@BrianMcCutchon 依赖于验证的“重量”。如果它很简单(例如空检查),那么设置器是合理的。如果它更复杂,那么我建议不要将它放在 setter 中。
-
@BrianMcCutchon 我同意一般编程,但通常你只需要提供你使用的框架的设置器,如 Jackson、mapstruct、JPA 等。
标签: java class validation oop constructor