如何在同一行上实例化对象和调用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();