正如标题所说,在任何编程语言中,关于 getter 和 setter 的讨论总是很多,Java 也是如此。
问题如下:自从 Java 8 发布以来是否有任何新的争论?
一个已经存在的争论的例子是 getter 和 setter 封装状态,或者它们可以在不改变 API 的情况下改变实现。
最佳答案
是的,有!由于引入了 Java 8 方法引用,正如其名称所示,它们只能与方法一起使用。
考虑以下代码:
class Person {
private String firstName;
private String lastName;
public Person(final String firstName, final String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
@Override
public String toString() {
return firstName + " " + lastName;
}
}
假设我们想要获得一个包含按姓氏分组的人员列表的 map ,我们只能通过使用以下代码的方法引用来做到这一点:
List<Person> personList = new ArrayList<>();
personList.add(new Person("Shannon", "Goldstein"));
personList.add(new Person("Donnie", "Denney"));
personList.add(new Person("Mark", "Thomas"));
personList.add(new Person("Julia", "Thomas"));
Map<String, List<Person>> personMapping = personList.stream()
.collect(Collectors.groupingBy(Person::getLastName));
System.out.println("personMapping = " + personMapping);
打印出来,格式很好:
personMapping = {
Thomas=[Mark Thomas, Julia Thomas],
Goldstein=[Shannon Goldstein],
Denney=[Donnie Denney]
}
如果我们使用 public
变量,这将不有效,因为您无法获得对它们的方法引用,也无法以其他方式引用它们,而不是编写一个完整的-成熟的 lambda,它不是必需的。
(对于好奇的人:需要使用 person -> person.lastName
)
此外,请记住,这个答案不同于有人声称如果一个对象需要遵守某个接口(interface),则 必须 使用 getter 和 setter。在此示例中,Person
类不遵循任何接口(interface),但受益于可用的 getter。
关于java - 自 Java 8 以来是否有使用 getter 和 setter 的新论点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22636747/