Como criar um object instantâneo e chamar setter na mesma linha?

Se eu tiver uma class Employee com um construtor padrão:

 private String firstName; public Employee(){} 

e um setter:

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

Por que essa tentativa não consegue instanciar e chamar o setter na mesma linha?

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

Você também pode usar esta syntax:

 Employee employee = new Employee() {{ setFirstName("John"); }}; 

Embora tenha em mente que ele vai criar uma class interna anônima e provavelmente não é o que você quer.

Porque setFirstName não retorna nada. Se você quiser encadear methods, então setFirstName teria que retornar Employee .

Outra abordagem é ter um construtor que tenha firstName como um argumento.

O método serFirstName é do tipo de retorno void (nada). Experimentar:

 public Employee setFirstName(String fname) { this.firstName = fname; return this; } 
 (employee = new Employee()).setFirstName("John"); 

executa a instanciação e chama o setter, como você solicitou no título, mas não declara a variável como sugerido em seu exemplo de código.

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

provavelmente não funcionará, eu assumo. Mas você pode tentar.

Claro, você sempre pode encher várias declarações em uma linha.

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

ou

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

Se eu fosse você, eu iria me contentar com um construtor com parâmetros, no entanto.

Deve ser assim:

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

Porque o que você deseja definir employee para o valor de .setFirstName("John"); que não retorna nada porque é um void

Então você pode mudar seu setter para:

 public Employee setFirstName(String fname) { this.firstName = fname; return this; } 

OU Crie um segundo construtor para Employee

 public Employee(String fname){this.firstName = fname;} 

Qual seria o firstname no init.

Embora isso seja um pouco exagerado, você poderia tentar usar o padrão de construtor

 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; } } 

Então você pode fazer o seguinte

 Employee e = new Employee.Builder().firstName("John").build();