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

时间:2014-03-25 13:55:53

标签: java oop getter java-8

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

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

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

2 个答案:

答案 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; }
}