【发布时间】:2016-07-03 18:51:21
【问题描述】:
在 Effective Java(第 2 版)的第 2 项中,作者提到了以下关于在使用 Builders 时对参数施加不变量:
在将参数从构建器复制到对象后检查它们是至关重要的,并且它们是在对象字段而不是构建器字段上检查的(第 39 项)。如果违反了任何不变量,则构建方法应抛出 IllegalStateException(条款 60)。
这是否意味着在构建方法创建了目标对象之后,应该将其传递给验证例程以进行任何所需的验证?
另外,有人可以解释一下这背后的原因吗?
【问题讨论】:
-
我想是因为构建器字段在被复制到对象后可能会被改变(例如,由另一个线程),这意味着构建器可以进入一个状态,它将创建一个“有效”对象,而以前它会创建一个“无效”对象。
-
很抱歉,但我不确定我是否理解正确。构建器将被创建为新的
.Builder.setter1().setter2.().build()。任何其他线程如何获得此特定构建器对象的引用? -
在这种情况下,它不能。但是一般来说,没有什么可以阻止构建器实例在线程之间共享:它只是一个引用,就像任何其他引用一样。
标签: java design-patterns builder effective-java