Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何实例化对象&;电话接线员在同一条线上?_Java - Fatal编程技术网

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