![]() |
1
20
看来你误读了课文。
这是一个很好的实践,在处理线程时特别有用。 但我们不能说使用setter 巴阿德 或者,特别是当单个线程正在使用对象时。非常安全。
不,这是个不错的做法。不是 非常安全 任何一个。视情况而定。 可变对象(而不是JavaBeans本身)的问题是使用不同的线程来访问它们。 必须同步访问,以避免一个线程在另一个线程访问对象时修改该对象。
为了确保对象是不可变的,您必须将属性声明为final。
如果你想给
因为变量是final,所以不能使用setter。你只需要提供一个getter。
这是完全线程安全的,最好的是,您不必同步访问,因为如果两个线程尝试获取
如果将来需要处理多线程应用程序,可以考虑使用不可变的JavaBean;)
顺便说一句,创建不可变bean并仍然提供一堆setter的替代方法是使用
它看起来非常类似于常规bean中使用的常规setXyz,其优点是使用不可变数据。
它获取现有的对象,复制所有的值,然后设置一个新的值。。。。
但是,在单线程模型中,使用getter/setter是完全安全的。 PS我强烈建议你买这本书: Effective Java . 你永远不会后悔,你会有信息来判断更好的文章,比如被引用的文章。 |
![]() |
2
6
现在你的课可以使用了。那么这里有什么问题?在实例化类和设置最终属性之间,您有一个对象处于内部不一致或不可用的状态,但是没有什么可以阻止您意外地使用它。我更喜欢一个系统,在这个系统中,类在实例化时自动处于一致的、可用的状态。出于这个原因,我更喜欢传递构造函数中的所有初始状态,或者,如果所述初始状态太复杂,则以散列映射或集合等的形式传递初始状态。用例场景现在是:
当然,这种设置最适合于更简单的对象。对于具有可选属性等更复杂的对象,您需要更进一步,使用其他人向您指出的生成器模式。当您有更复杂的场景时,构建器是不错的,IMO,但是对于更简单、更直接的参数化,仅仅使用构造函数参数或某种类型的参数对象就足够了。 |
![]() |
3
3
我喜欢那些家伙。断章取义已经是我不相信这篇文章的理由。
编辑: 请参阅Google Books上的effectivejava中的第2项(“当面临许多构造函数参数时考虑一个生成器”): http://books.google.com/books?id=ka2VUBqHiWkC&lpg=PP1&pg=PA11#v=onepage&q&f=false |
![]() |
4
2
新人(“param 1”,“param 2”,“param 3”,“param 4”,“param 5”,“param 6”,“param 7”,“param 8”) 那你的目标太复杂了。您将需要参数对象(请参阅martinfowler重构手册)。
当您需要更改对象时,添加一个复制构造函数(即clone方法)。现代的jvm处理这个问题非常容易和迅速,而且几乎没有速度损失。您还可以使Hotspot和GC变得简单。 |
![]() |
5
0
|