自Java 8以来,是否有新的理由使用getter和setter?

7
作为标题所述,在任何编程语言中,特别是在Java中,getter和setter一直存在着很多讨论。
问题是:自从Java 8发布以来,是否有任何新的论据?
一个已经存在的论点的例子是getter和setter封装状态,或者说它们使得在不改变API的情况下改变实现成为可能。
2个回答

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]
}

如果我们使用公共变量,这将无法工作,因为您不能在它们上面获取方法引用,也不能以除编写完整的lambda之外的其他方式引用它们。(对于好奇的人:需要使用person -> person.lastName
此外,请记住,此答案与声称如果对象需要遵循某个接口,则必须使用getter和setter的说法不同。在此示例中,Person类未遵循任何接口,但受益于具有可用的getter。


1
+1 我一直更喜欢使用较短的getter/setters void lastName(String lastName)String lastName() - Peter Lawrey
6
@PeterLawrey 如果你将IDE设置为在输入时弹出建议,那么我发现它们非常烦人,就像getXXX版本一样,当你键入 g 时,会立即获取所有getter的列表。 - skiwi
1
我按照IDE中可见的字段名称并添加()。无论如何,这只是一个风格问题,我同意你的答案。 - Peter Lawrey

-4
public class Customer {
  private String email;
  public void setEmail(String email) { this.email = email; }
  public String getEmail() { return email; }
}

这并没有回答原问题,只是Java中setter和getter的标准示例。 - Ben Visness

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接