最近我正在研究Java中的封装概念。我想知道是否使数据变量私有以及公共setter方法在简单的POJO类中真的有意义?请参考以下POJO:
public class Employee{
private String id;
private String name;
private String department;
private int age;
public Employee(){
}
public Employee(String id, String name, String department, int age){
this.id = id;
this.name = name;
this.department = department;
this.age = age;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDepartment() {
return department;
}
public void setDepartment(String department) {
this.department = department;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
我的意思是,当我可以使用setter方法更改它时,为什么我要使名称变量私有?
一般情况下,它将是非常基本的
public void setName(String name) {
this.name = name;
}
和只做employee.name = "william hammond"
是一样的。但是想象一下,如果你想要实现像private String normalize(string username)
方法这样的东西,你可能会将其全部小写,检查有效名称或防止unicode条目。如果你一开始就把name
设为公共,你就会让用户执行employee.name = "whatever they want :) 123"
,你就会失去执行该约束的能力。
请参见为什么使用getter和setter/accessors?
使用getter/setter被认为是一种良好的做法,但它往往是多余的——就像你的例子一样。
如果你有方法在设置之前改变变量,那么最好为基本字段设置getter/setter,以保持一致的代码风格。
这里有一篇很好的文章:https://dzone.com/articles/getter-setter-use-or-not-use-0
让我们看一个例子:
public class Example {
private String firstName;
private String lastName;
public Example(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
public String getFullName() {
return firstName + " " + lastName;
}
}
这个类有三个属性(firstName, lastName, fullName),但只有两个字段(姓,名)。这是有意义的,因为可以通过结合名字和姓氏来检索全名。
然而,我注意到我在程序中多次调用getFullName()
,但我几乎从不调用getFirstName()
和getLastName()
。这减慢了我的程序,因为每次调用getFullName()
时我都需要创建一个新的字符串。因此,我重构了我的代码以获得更好的性能:
public class Example {
private String fullName;
public Example(String firstName, String lastName) {
this.fullName = firstName + " " + lastName;
}
public String getFirstName() {
return fullName.split(" ")[0];
}
public String getLastName() {
return fullName.split(" ")[1];
}
public String getFullName() {
return fullName;
}
}
现在我的代码在调用getFullName()
时工作得更快,但在调用getFirstName()
和getLastName()
时工作得更慢,然而这正是我所需要的。从外部来看,没有什么变化。
从给定的示例中可以看到,字段描述你的类如何使用计算机内存,但不一定是哪些属性你们班有。这就是为什么字段应该被视为实现细节因此对类来说是私有的。