как делать несколько конструкторов?
У меня есть класс с 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 шт):
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 представляет ссылку на текущий экземпляр класса. Через это ключевое слово мы можем обращаться к переменным, методам объекта, а также вызывать его конструкторы.
public Employee(String firstName, String lastName, String salary, String department) {}
просто делаешь еще один конструктор
public Employee(String firstName, String lastName){}
И в зависимости от количества параметров будет вызываться соответствующий конструктор. Если 4 параметра то первый, если 2 параметра то второй
есть ли способ в методах, делать разные конструкторы, чтоб один принимал 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 придётся использовать указанные статические методы-генераторы.
В таком случае (когда все поля одного типа) лучше использовать паттерн Строитель. 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;
}