看来你误读了文字。
现在我可以同意最后一个,但在我看来,列表中的 JavaBean 比嵌套 Map 更有意义
文本从未提及嵌套映射作为替代方案(yiack)
...应该调用构造函数,而不是 set* 方法,并且对象应该是不可变的
这是一个很好的做法,在处理线程时特别有用。
但我们不能说使用 setter 是baaad要么,特别是当单个线程正在使用该对象时。这是绝对安全的。
我不想每次给出新信息时都创建一个新对象,我想将其添加到现有对象中。
没关系,只要您控制该对象就没有问题,其他人可能会发现创建新对象更容易。
使用 JavaBean 进行数据存储是一种不好的做法并且应该避免,还是完全安全?
不,这不是一个坏习惯。不是万无一失任何一个。视情况而定。
可变对象(不是 JavaBean 本身)的问题是使用不同的线程来访问它们。
您必须同步访问以避免一个线程在其他线程访问该对象时修改该对象。
不可变对象没有这个问题,因为,..它们不能改变,因此,你不必同步任何东西。
为了确保对象不可变,您必须将属性声明为最终属性。
class MyBean {
private final int i;
}
如果你想分配一个合理的值MyBean.i
你必须在构造函数中指定它:
public MyBean( int i ) {
this.i = i;
}
由于变量是最终变量,因此不能使用 setter。你可以只提供一个吸气剂。
这是完全线程安全的,最好的是,您不必同步访问,因为如果两个线程尝试获取i
它们都将始终看到实例化时分配的值,您不必同步任何内容。
不是不好的做法,也不是好的做法。即使在像 servlet 这样的多线程环境中,我们也必须使用单线程。
如果将来您必须处理多线程应用程序,您可以考虑使用不可变的 JavaBean ;)
顺便说一句,创建不可变 bean 并仍然提供一堆设置器的替代方法是使用Builders
like:
Employee e = new EmployeeBuilder()
.setName("Oscar")
.setLastName("Reyes")
.setAge(0x1F)
.setEmployeeId("123forme")
.build();
它看起来与常规 bean 中使用的常规 setXyz 非常相似,优点是使用不可变数据。
如果需要更改一个值,可以使用类方法:
Employee e = Employee.withName( e, "Mr. Oscar");
它获取现有对象,复制所有值,然后设置一个新对象......
public static EmployeeWithName( Employee e , String newName ){
return new Employee( newName, e.lastName, e.age, e.employeeId );
}
但同样,在单线程模型中使用 getter/setter 是完全安全的。
PS我强烈建议你购买这本书:有效的Java http://java.sun.com/docs/books/effective/。你永远不会后悔,而且你将有信息来判断更好的文章,比如引用的一篇文章。