Jon*_*nas 78 java immutability pojo javabeans
我现在已经实现了一些Java应用程序,到目前为止只有桌面应用程序.我更喜欢使用不可变对象在应用程序中传递数据,而不是使用带有mutator(setter 和getter)的对象,也称为JavaBeans.
但是在Java世界中,使用JavaBeans似乎更常见,我无法理解为什么我应该使用它们.就个人而言,如果代码只处理不可变对象而不是一直改变状态,那么代码看起来会更好.
第15项中还建议使用不可变对象:最小化可变性,有效Java 2ed.
如果我有一个Person实现为JavaBean的对象,它看起来像:
public class Person {
private String name;
private Place birthPlace;
public Person() {}
public setName(String name) {
this.name = name;
}
public setBirthPlace(Place birthPlace) {
this.birthPlace = birthPlace;
}
public String getName() {
return name;
}
public Place getBirthPlace() {
return birthPlace;
}
}
Run Code Online (Sandbox Code Playgroud)
并且Person实现为不可变对象:
public class Person {
private final String name;
private final Place birthPlace;
public Person(String name, Place birthPlace) {
this.name = name;
this.birthPlace = birthPlace;
}
public String getName() {
return name;
}
public Place getBirthPlace() {
return birthPlace;
}
}
Run Code Online (Sandbox Code Playgroud)
或者更靠近structC:
public class Person {
public final String name;
public final Place birthPlace;
public Person(String name, Place birthPlace) {
this.name = name;
this.birthPlace = birthPlace;
}
}
Run Code Online (Sandbox Code Playgroud)
我也可以在不可变对象中使用getter来隐藏实现细节.但是因为我只使用它作为struct我喜欢跳过"吸气剂",并保持简单.
简单地说,我不明白为什么使用JavaBeans更好,或者我是否可以而且应该继续使用我的不可变POJO?
许多Java库似乎对JavaBeans有更好的支持,但是对不可变POJO的更多支持随着时间的推移会越来越受欢迎?
JUS*_*ION 76
Ben*_*ton 39
我很惊讶Thread这个词在这个讨论中没有出现过.
不可变类的一个主要好处是,由于没有可变的共享状态,它们本质上更加线程安全.
这不仅可以使您的编码更容易,而且还可以为您带来两个性能优势:
减少同步需求.
更多使用final变量的范围,这可以促进后续的编译器优化.
我真的想对不可变对象,而不是JavaBean风格的类运动.通过getter和setter揭露对象的胆量可能不应该是默认的选择.
And*_*anu 16
那取决于你想要做什么.如果您使用持久层,并从数据库中获取某些行到POJO,并且您想要更改属性并将其保存回来,那么使用JavaBean样式会更好,特别是如果您有很多属性.
考虑到你的人,有很多领域,如,第一,中间,姓氏,出生日期,家庭成员,教育,工作,工资等.
那个人恰好是一个刚刚结婚并被接受更改姓氏的女性,你需要更新数据库.
如果你正在使用不可变的POJO,你获取一个代表她的Person对象,然后你创建一个新的Person对象,你传递所有你没有按原样改变的属性和新的姓氏,然后保存它.
如果它是Java bean,你可以只做setLastName()并保存它.
这是'最小化可变性'而不是'永远不会使用可变对象'.有些情况下可变对象的效果更好,确定一个对象是否可变更适合你的程序真的是你的工作.你不应该总是说'必须使用不可变对象',而是在你开始伤害自己之前看看有多少个类可以变成不可变的.
总结其他答案我认为:
get(id): Client和save(MutableClient),是MutableClient客户端的一些后裔.如果存在中间点(create,set properties,make inmutable),那么框架可能会鼓励更多不可改变的方法.
无论如何,我建议将不可变对象视为"只读Java Bean",强调如果你是一个好孩子并且不触及那个危险的setProperty方法,一切都会好的.
| 归档时间: |
|
| 查看次数: |
14099 次 |
| 最近记录: |