как делать несколько конструкторов?

У меня есть класс с 4 аргументами

public class Employee {
private String firstName;
private String lastName;
private String salary;
private String department;

есть ли способ в методах, делать разные конструкторы, чтоб один принимал lastName firstname, другой Salary department.

  public Employee add(String firstName, String lastName) {
      Employee employee = new Employee(firstName, lastName);

чтобы не выдавало "Expected 4 arguments but found 2"


Ответы (4 шт):

Автор решения: TheXSVV
public class Employee {

  private final String firstName;
  private final String lastName;
  private final String salary;
  private final String department;

  public Employee(String firstName, String lastName, String salary, String department) {
    this.firstName = firstName;
    this.lastName = lastName;
    this.salary = salary;
    this.department = department;
  }

}
public Employee add() {
  Employee employee = new Employee("first name", "last name", "salary", "department");
}

Ключевое слово this представляет ссылку на текущий экземпляр класса. Через это ключевое слово мы можем обращаться к переменным, методам объекта, а также вызывать его конструкторы.

→ Ссылка
Автор решения: Upiter 1401
public Employee(String firstName, String lastName, String salary, String department) {}

просто делаешь еще один конструктор

public Employee(String firstName, String lastName){}

И в зависимости от количества параметров будет вызываться соответствующий конструктор. Если 4 параметра то первый, если 2 параметра то второй

→ Ссылка
Автор решения: Nowhere Man

есть ли способ в методах, делать разные конструкторы, чтоб один принимал lastName firstname, другой Salary department.

"Делать" конструкторы в данном случае не получится, поскольку в данном случае все аргументы/поля в классе Employee однотипны (String).
Вместо конструкторов можно написать два разных метода-генератора, которые будут вызывать полный конструктор с четырьмя аргументами, подставляя некие значения по умолчанию или null.

Замечание: использование строк для хранения информации об отделе и особенно о зарплате не самый удачный выбор

public class Employee {
    private static final String UNKNOWN = "Unknown";

    private String firstName;
    private String lastName;
    private String salary;
    private String department;

    public Employee(String first, String last, String salary, String dept) {
        this.firstName = first;
        this.lastName = last;
        this.salary = salary;
        this.department = dept;
    }

    public static Employee byName(String first, String last) {
        return new Employee(first, last, UNKNOWN, null);
    }

    public static Employee bySalaryAndDept(String salary, String dept) {
        return new Employee("John", "Doe", salary, dept);
    }
}

Можно даже ограничить видимость общего конструктора, установив private, тогда для создания экземпляров Employee придётся использовать указанные статические методы-генераторы.

→ Ссылка
Автор решения: Ilya Lisov

В таком случае (когда все поля одного типа) лучше использовать паттерн Строитель. https://refactoring.guru/ru/design-patterns/builder

То есть Вам необходимо создать конструктор по умолчанию, который будет создавать пустой объект и возвращать ссылку на него. А после вызывать на нем методы addFirstName, addLastName, addSalary, addDepartment

Employee employee = new Employee().addFirstName("Bob").addSalary("1000");

А они будут реализованы следующим способом:

public Employee addFirstName(String firstName) {
    this.setFirstName(firstName);
    return this;
}
→ Ссылка