作为标题所述,在任何编程语言中,特别是在Java中,getter和setter一直存在着很多讨论。
问题是:自从Java 8发布以来,是否有任何新的论据?
一个已经存在的论点的例子是getter和setter封装状态,或者说它们使得在不改变API的情况下改变实现成为可能。
问题是:自从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;
}
}
假设我们想要获取一个按照姓氏分组的人员列表的映射,我们只能通过以下代码中的方法引用来实现:
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]
}
如果我们使用公共变量,这将无法工作,因为您不能在它们上面获取方法引用,也不能以除编写完整的lambda之外的其他方式引用它们。(对于好奇的人:需要使用person -> person.lastName
)
此外,请记住,此答案与声称如果对象需要遵循某个接口,则必须使用getter和setter的说法不同。在此示例中,Person
类未遵循任何接口,但受益于具有可用的getter。
public class Customer {
private String email;
public void setEmail(String email) { this.email = email; }
public String getEmail() { return email; }
}
void lastName(String lastName)
和String lastName()
。 - Peter LawreygetXXX
版本一样,当你键入g
时,会立即获取所有getter的列表。 - skiwi