Java 如何实例化对象&;电话接线员在同一条线上?
如果我有一个带有默认构造函数的Java 如何实例化对象&;电话接线员在同一条线上?,java,Java,如果我有一个带有默认构造函数的Employee类: private String firstName; public Employee(){} 和一个二传手: public void setFirstName(String firstName){ this.firstName = firstName; } 为什么此尝试无法在同一行中实例化和调用setter Employee employee = new Employee().setFirstName("John"); 因为setF
Employee
类:
private String firstName;
public Employee(){}
和一个二传手:
public void setFirstName(String firstName){
this.firstName = firstName;
}
为什么此尝试无法在同一行中实例化和调用setter
Employee employee = new Employee().setFirstName("John");
因为
setFirstName
不返回任何内容。如果要链接方法,则setFirstName
必须返回Employee
另一种方法是让构造函数将
firstName
作为参数。方法serFirstName
是返回类型void
(nothing)。尝试:
您还可以使用以下语法:
Employee employee = new Employee() {{
setFirstName("John");
}};
但是请记住,它将创建一个匿名的内部类,可能不是您想要的。它应该是这样的:
Employee employee = new Employee();
employee.setFirstName("John");
static final Function<String, Employee> EMPLOYEE = firstName -> {
Employee employee = new Employee();
employee.setFirstName(firstName);
return employee;
};
Employee jake = EMPLOYEE.apply("Jake");
因为您希望将
employee
的值设置为.setFirstName(“John”)
不返回任何内容,因为它是一个无效的
因此,您可以将setter更改为:
public Employee setFirstName(String fname) {
this.firstName = fname;
return this;
}
或者为员工创建第二个构造函数
public Employee(String fname){this.firstName = fname;}
这将在init上设置firstname
。虽然这有点过分,但您可以尝试使用
然后您可以执行以下操作
Employee e = new Employee.Builder().firstName("John").build();
按照标题中的要求执行实例化并调用setter,但不按照代码示例中的建议声明变量
(Employee employee = new Employee()).setFirstName("John");
我想这可能行不通。但是你可以试试
当然,您总是可以在一行中填充多个语句
Employee employee; (employee = new Employee()).setFirstName("John");
或
如果我是你,我会选择参数化构造函数。为了让代码正常工作,你必须在setter方法setFirstName
中返回员工(意思是“this”)
如果您不拥有Employee类(我知道这只是一个简单的示例,但为了论证起见),并且无法修改它,那么解决这个问题的一种方法就是使用函数编程。您可以声明自己的函数如下:
Employee employee = new Employee();
employee.setFirstName("John");
static final Function<String, Employee> EMPLOYEE = firstName -> {
Employee employee = new Employee();
employee.setFirstName(firstName);
return employee;
};
Employee jake = EMPLOYEE.apply("Jake");
也许不完全是你想要的,但仍然有用。@whiskyserra我提到它是因为很多人不知道这种语法,虽然它很容易被滥用,但它也经常派上用场问题是如何在同一平台上实例化line@Steve是的,但是和二传手在同一条线上做是很糟糕的风格。以上更为惯用。只需使用生成器模式,让setter在最后返回整个对象。问题解决了。优雅。既然你可以在setter的末尾返回this
,为什么还要麻烦呢?您将获得一个有效的Employee e=new Employee().setFirstName(“John”)代码>如果选择使用生成器模式,我建议使用Lombok。它可以帮助你摆脱上面所有的陈词滥调。看看这个简单的例子:
Employee jake = EMPLOYEE.apply("Jake");