java - 自 Java 8 以来是否有使用 getter 和 setter 的新论点?

标签 java oop getter java-8

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

问题如下:自从 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;
    }
}

假设我们想要获得一个包含按姓氏分组的人员列表的 map ,我们只能通过使用以下代码的方法引用来做到这一点:

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)

此外,请记住,这个答案不同于有人声称如果一个对象需要遵守某个接口(interface),则 必须 使用 getter 和 setter。在此示例中,Person 类不遵循任何接口(interface),但受益于可用的 getter。

关于java - 自 Java 8 以来是否有使用 getter 和 setter 的新论点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22636747/

相关文章:

java - JTextPane 输出奇怪的控制台字符

arrays - FormArray嵌套在另一个FormArray中时,如何获取FormArrayName?

java - JavaScript 和 Java 中的访问器和修改器之间的区别

java - 获取preferences.xml中定义的默认值

oop - 什么是多态性、它的用途是什么以及如何使用它?

c# - 我如何传入 DateTime 的参数,使其对应于 C# 中所需的形式参数

java - 如何使用 3 个数组的数据实现二叉树的中序、前序和后序遍历

java - 哪个约定更好?

java - 非类 BroadcastReceiver 的显式 Intent

java - 为什么在面向对象的编程中,要在变量中实例化对象的父类(super class)和子类?