Ответ 1
Вы также можете использовать этот синтаксис:
Employee employee = new Employee() {{
setFirstName("John");
}};
Хотя имейте в виду, что он собирается создать анонимный внутренний класс и, вероятно, не то, что вы хотите.
Если у меня есть класс Employee
со стандартным конструктором:
private String firstName;
public Employee(){}
и сеттер:
public void setFirstName(String firstName){
this.firstName = firstName;
}
Почему эта попытка не удается создать экземпляр и вызвать сеттер в одной строке?
Employee employee = new Employee().setFirstName("John");
Вы также можете использовать этот синтаксис:
Employee employee = new Employee() {{
setFirstName("John");
}};
Хотя имейте в виду, что он собирается создать анонимный внутренний класс и, вероятно, не то, что вы хотите.
Потому что setFirstName
ничего не возвращает. Если вы хотите связать методы, тогда setFirstName
должен был бы возвратить Employee
.
Другой подход заключается в создании конструктора, который принимает firstName
в качестве аргумента.
Метод serFirstName
имеет тип возврата void
(ничего). Попробуйте:
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");
Хотя это немного перебор, вы можете попробовать использовать шаблон
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();
Поскольку вы хотите установить employee
значение .setFirstName("John");
, которое ничего не возвращает, поскольку это void
Таким образом, вы можете либо изменить свой сеттер на:
public Employee setFirstName(String fname) {
this.firstName = fname;
return this;
}
ИЛИ Создайте второй конструктор для employee
public Employee(String fname){this.firstName = fname;}
Что бы установить firstname
в init.