正如标题所说,在任何编程语言中都存在关于getter和setter的讨论,而Java也是如此。
问题如下:自 Java 8 发布以来,有没有新的论点?
现有参数的一个示例是getter和setter封装状态,或者它们可以在不更改API的情况下更改实现。
答案 0 :(得分:12)
是的,有!由于引入了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;
}
}
假设我们想要获取一个地图,其中包含按姓氏分组的人员列表,我们可以仅通过方法参考使用以下代码执行此操作:
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
需要被使用)
另外,请记住,这个答案不同于某人声称如果某个对象需要遵循某个界面,那么必须使用getter和setter 。在此示例中,Person
类不遵循任何接口,但可以获得getter。
答案 1 :(得分:-4)
public class Customer {
private String email;
public void setEmail(String email) { this.email = email; }
public String getEmail() { return email; }
}