如何在同一行上实例化对象和调用setter?
如果我有一个带有默认构造函数的Employee
类:
private String firstName; public Employee(){}
和一个二传手:
public void setFirstName(String firstName){ this.firstName = firstName; }
为什么这个尝试无法实例化并在同一行中调用setter?
Employee employee = new Employee().setFirstName("John");
您也可以使用以下语法:
Employee employee = new Employee() {{ setFirstName("John"); }};
虽然请记住,它会创建一个匿名的内部类,可能不是你想要的。
因为setFirstName
不返回任何内容。 如果要链接方法,则setFirstName
必须返回Employee
。
另一种方法是使用firstName
作为参数的构造函数。
方法serFirstName
的返回类型为void
(nothing)。 尝试:
public Employee setFirstName(String fname) { this.firstName = fname; return this; }
(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");
如果我是你,我会选择参数化构造函数。
它应该是这样的:
Employee employee = new Employee(); employee.setFirstName("John");
因为您要将employee
设置为.setFirstName("John");
这不会返回任何东西,因为它是一个void
所以你可以将你的二传手改为:
public Employee setFirstName(String fname) { this.firstName = fname; return this; }
或者为Employee
创建第二个构造函数
public Employee(String fname){this.firstName = fname;}
哪个会在init上设置firstname
。
虽然这有点矫枉过正,但您可以尝试使用构建器模式
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();