如果我有一个带有默认构造函数的Employee
类:
private String firstName;
public Employee(){}
和一个二传手:
public void setFirstName(String firstName){
this.firstName = firstName;
}
为什么这个尝试无法实例化并在同一行中调用setter?
Employee employee = new Employee().setFirstName("John");
答案 0 :(得分:24)
您也可以使用以下语法:
Employee employee = new Employee() {{
setFirstName("John");
}};
虽然请记住,它会创建一个匿名的内部类,可能不是你想要的。
答案 1 :(得分:10)
因为setFirstName
没有返回任何内容。如果您想链接方法,则setFirstName
必须返回Employee
。
另一种方法是使用firstName
作为参数的构造函数。
答案 2 :(得分:3)
方法serFirstName
的返回类型为void
(无)。尝试:
public Employee setFirstName(String fname) {
this.firstName = fname;
return this;
}
答案 3 :(得分:3)
(employee = new Employee()).setFirstName("John");
按照标题中的要求执行实例化并调用setter,但不会按照代码示例中的建议声明变量。
(Employee employee = new Employee()).setFirstName("John");
我猜,可能不会起作用。但你可以试试。
当然,您总是可以在一行中填充多个语句。
Employee employee; (employee = new Employee()).setFirstName("John");
或
Employee employee = new Employee(); employee.setFirstName("John");
如果我是你,我会选择参数化构造函数。
答案 4 :(得分:2)
应该是这样的:
Employee employee = new Employee();
employee.setFirstName("John");
答案 5 :(得分:1)
因为您要将employee
设置为.setFirstName("John");
的值,因为它是void
所以你可以将你的二传手改为:
public Employee setFirstName(String fname) {
this.firstName = fname;
return this;
}
或者为Employee
public Employee(String fname){this.firstName = fname;}
这将在init上设置firstname
。
答案 6 :(得分:1)
虽然这有点矫枉过正,但您可以尝试使用builder pattern
public class Employee{
private String firstName;
public static class Builder{
private String firstName;
public Builder firstName(String firstName){
this.firstName = firstName;
return this;
}
public Employee build(){
return new Employee(this);
}
}
private Employee(Builder builder){
firstName = builder.firstName;
}
}
然后你可以做以下
Employee e = new Employee.Builder().firstName("John").build();
答案 7 :(得分:0)
为了使代码正常工作,您必须在设置方法Employee
中返回setFirstName
(意思是“ this”)。
如果您不拥有Employee类(我知道这只是一个简单的示例-但为了论证)而不能修改它,一种解决方法是使用函数式编程。您可以这样声明一个函数:
static final Function<String, Employee> EMPLOYEE = firstName -> {
Employee employee = new Employee();
employee.setFirstName(firstName);
return employee;
};
然后您可以像这样在一行中创建您的员工:
Employee jake = EMPLOYEE.apply("Jake");
也许不是您想要的,但仍然有用。