作为标题,我正在阅读<Effective Java>
,但当我阅读第2章时,它说
答案 0 :(得分:1)
当对象不可变时,与对象(如JavaBeans) mutable 相比,您更不用担心了。一旦你有了一个不可变对象,它基本上不受线程同步问题的影响,你可以自由地传递它而不需要制作防御性副本(以保护用户或善意的库方法不改变数据)。
自然地,创建一个可变对象可能很棘手,并且可能涉及构造函数太长而无法管理。这是Builder模式可以帮助您的地方 - 使用可变构建器创建初始状态,然后将其复制到该对象构造函数中的不可变对象。
请注意,如果不可变对象包含对任何可变对象的引用,则外部对象实际上不是不可变的。您可以在Guava中找到ImmutableList
,ImmutableMap
和ImmutableSet
。
答案 1 :(得分:0)
Builder
模式更安全,因为Builder可以在将所有参数传递给构造函数之前验证它们。
您可能会从谷歌手中找到Preconditions
。
更不用说,使用Builder可以非常简洁地构建复杂对象。
我不会说构建器模式后面的对象比immutable
更多或更少JavaBean
或可变。{{1}}。这取决于您如何声明字段以及您公开的方法。