Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
自Java8以来,是否有新的参数可以使用getter和setter?_Java_Oop_Getter_Java 8 - Fatal编程技术网

自Java8以来,是否有新的参数可以使用getter和setter?

自Java8以来,是否有新的参数可以使用getter和setter?,java,oop,getter,java-8,Java,Oop,Getter,Java 8,正如标题所说,关于任何编程语言中的getter和setter都有很多讨论,Java也是如此 问题是:自从Java8发布以来,有没有新的论据 一个已经存在的参数的例子是getter和setter封装了状态,或者它们可以在不更改API的情况下更改实现。是的,有!由于引入了Java8方法引用,正如其名称所示,它们只能与方法一起使用 考虑以下代码: class Person { private String firstName; private String lastName;

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

问题是:自从Java8发布以来,有没有新的论据


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

是的,有!由于引入了Java8方法引用,正如其名称所示,它们只能与方法一起使用

考虑以下代码:

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);
假设我们想要获得一个包含按姓氏分组的人员列表的地图,我们只能通过使用以下代码的方法引用来实现这一点:

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);
如果我们使用的是
public
变量,这将不起作用,因为您无法获得对它们的方法引用,也无法以其他方式引用它们,除非在不需要的地方编写一个完整的lambda。
(对于好奇的人:
person->person.lastName
需要使用)


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

+1我一直喜欢较短的getter/setter
void lastName(String lastName)
String lastName()
@PeterLawrey如果您将IDE设置为在键入时弹出建议,我会觉得它们很烦人,与
getXXX
版本一样,当您键入
g
时,您将立即获得所有getter的列表。我根据可以在IDE中看到的字段名添加()。无论如何,这只是风格的问题,我同意你的回答。这并没有解决最初的问题。这只是Java中setter和getter的标准示例。
public class Customer {
  private String email;
  public void setEmail(String email) { this.email = email; }
  public String getEmail() { return email; }
}