在简单POJO中使用私有数据变量



最近我正在研究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()时工作得更慢,然而这正是我所需要的。从外部来看,没有什么变化。


从给定的示例中可以看到,字段描述你的类如何使用计算机内存,但不一定是哪些属性你们班有。这就是为什么字段应该被视为实现细节因此对类来说是私有的。

最新更新