Подтвердить что ты не робот

Как настроить объект и вызов в той же строке?

Если у меня есть класс Employee со стандартным конструктором:

private String firstName;
public Employee(){}

и сеттер:

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

Почему эта попытка не удается создать экземпляр и вызвать сеттер в одной строке?

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

Ответ 1

Вы также можете использовать этот синтаксис:

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

Хотя имейте в виду, что он собирается создать анонимный внутренний класс и, вероятно, не то, что вы хотите.

Ответ 2

Потому что setFirstName ничего не возвращает. Если вы хотите связать методы, тогда setFirstName должен был бы возвратить Employee.

Другой подход заключается в создании конструктора, который принимает firstName в качестве аргумента.

Ответ 3

Метод serFirstName имеет тип возврата void (ничего). Попробуйте:

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

Ответ 4

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

Если бы я был вами, я бы согласился на параметризованный конструктор.

Ответ 5

Это должно быть так:

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

Ответ 6

Хотя это немного перебор, вы можете попробовать использовать шаблон

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

Поскольку вы хотите установить employee значение .setFirstName("John");, которое ничего не возвращает, поскольку это void

Таким образом, вы можете либо изменить свой сеттер на:

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

ИЛИ Создайте второй конструктор для employee

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

Что бы установить firstname в init.