我很惭愧地问这个问题,但它已经困扰了我多年.我是一家大公司的高级开发员,从2013年开始。
我的工作是JAVA JEE(主要是后端)和Android开发(JAVA)。
我们有大量的 "Value Objects","DTOs "等等,每个对象都有私有属性和gettersetters。每个属性都会有一个gettersetter。
public class UserVo {
private String name;
private String email;
private String password;
public UserVo(String name, String email, String password) {
this.name = name;
this.email = email;
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
当我问为什么不把它们公开,我被告知:"这是因为封装,像这样的值是安全的,不能直接修改。"是的,它们可以,你可以直接做myObject.setMyProperty(a value)。
那为什么呢,为什么我们要把getter和setter放在那些对象的每个属性上呢,为什么不使用公共属性呢?
我在多个大型项目中,这些东西无处不在.通常你从数据库中得到一个实体,然后你把它转换成一个 "VO",这个 "VO "和实体的对象完全一样,同样的属性,同样的getteretter。
或者有时人们想把数据移动到比列表或多个变量更可读的东西中,并创建自己的 "VO",并为每个变量提供一些私有属性和getterssetters。
如果有人用公共字段来制作它们,那么猎奇就开始了,每个人都在笑着说 "ooh you don't know about encapsulation?", "NEVER make public fields!", "Have you been to school?".坦率地说,每个人都这样做,但没有人知道为什么。
哦,我知道价值对象模式说它们是不可变的,但在现实生活中,它们不是,至少在我工作的7个项目中不是。
我所有项目的通用架构都是.NET。
.................
Dao and Managers -> they return entities
.................
Value objects that have the same structure than your entities (sometimes they name them DTOs)
.................
View controllers (JAVE JEE) / Activity or Fragments (Android)
.................
层隔离是另一个主题,这只是为了告诉你我们在哪里使用价值对象,然后在视图层使用VO (并根据用户的操作进行修改),然后再发回给管理人员,由他们建立实体并持久化。
对这个问题有什么想法吗?谢谢。