自Java 8以来,是否存在使用getter和setter的新参数?

ski*_*iwi 7 java oop getter java-8

正如标题所说,在任何编程语言中都有关于getter和setter的讨论,Java也是如此.

问题如下:自Java 8发布以来,有没有新的论点?

现有参数的一个示例是getter和setter封装状态,或者它们可以在不更改API的情况下更改实现.

ski*_*iwi 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

假设我们想要获得一个包含按姓氏分组的人员列表的地图,我们只能通过方法参考使用以下代码来实现:

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);
Run Code Online (Sandbox Code Playgroud)

打印出来,格式很好:

personMapping = {
    Thomas=[Mark Thomas, Julia Thomas], 
    Goldstein=[Shannon Goldstein], 
    Denney=[Donnie Denney]
}
Run Code Online (Sandbox Code Playgroud)

如果我们使用变量,这将无法工作public,因为您无法获取它们的方法引用,也不能以其他方式引用它们,除了在不需要的地方编写完整的lambda.
(对于好奇的人:person -> person.lastName需要使用)

另外,请记住,这个答案不同于声称如果某个对象需要遵循某个接口,那么必须使用getter和setter的人.在这个示例中,Person类不遵循任何接口,但可以获得getter.

  • @PeterLawrey如果你设置你的IDE在键入时弹出建议,我发现它们很烦人,就像`getXXX`版本一样,当你键入`g`时,你会立即获得所有getter的列表. (6认同)