如何实例化对象;在同一条线上设置呼叫器?

时间:2011-06-13 19:16:13

标签: java

如果我有一个带有默认构造函数的Employee类:

private String firstName;
public Employee(){}

和一个二传手:

public void setFirstName(String firstName){
    this.firstName = firstName;
}

为什么这个尝试无法实例化并在同一行中调用setter?

Employee employee = new Employee().setFirstName("John");

8 个答案:

答案 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");

也许不是您想要的,但仍然有用。