Сократить код повторяющихся конструкторов
Знатоки. Я только начинаю программировать, поэтому приходится задавать такие примитивные вопросы. Вот один из них.
У меня есть класс который оперирует несколькими переменными.
Мне крайне не приятно повторять конструктор для каждого варианта определенности переменных. В одном случае конструктор по умолчанию, переменные без определения, в другом, одна переменная задается в конструкторе, в третьем две и так по нарастающей последовательности.
И каждый раз я вынужден дублировать конструктор, вместо того чтобы внутри конструктора задать условия и соответствующие значения. Т.е. несколько конструкторов заменить одним.
Я догадываюсь, что практики не повторяют свой код и пользуются одним конструктором с пустыми входящими полями(по умолчанию) и одним с переменным количеством заданных полей. -Мне очень интересно как Вы это делаете))) Заранее благодарю. Всем хорошего настроения.
Пример кода прост:
паблик класс Кот() {
поле 1, поле 2, поле 3;
конструктор Кот () {}
конструктор Кот (поле 1, поле 2) {
зис.поле 1 = поле 1;
зис.поле 2 = поле 2;
}
конструктор Кот (поле 1, поле 2, поле 3) {
зис.поле 1 = поле 1;
зис.поле 2 = поле 2;
зис.поле 3 = поле 3;
}
и т.д.
}
Ответы (2 шт):
Насколько я понимаю, основная проблема в том, что вам не нравится большое количество кода из-за конструкторов. Возможные решения проблемы:
1. Создайте один конструктор, который будет принимать все параметры:
public class Person {
String name;
int age;
boolean isMan;
public Person(String name, int age, boolean isMan) {
this.name = name;
this.age = age;
this.isMan = isMan;
}
}
А потом создайте конструкторы с нужными вам параметрами, которые будут делегировать создание объекта на этот большой конструктор:
public Person() {
this("default", 10, true);
}
public Person(String name) {
this(name, 10, true);
}
public Person(String name, int age) {
this(name, age, true);
}
Кода получится гораздо меньше.
2. Если вы хотите передавать в конструктор несколько переменных одного типа, вы можете использовать varargs, что выглядит вот так:
public Person(String ... properties) {
this.name = properties[0] != null ? properties[0] : "default";
///далее
}
Особенность varargs в том, что вы можете передавать в конструктор неопределённое количество элементов (в том числе и 0), а на входе всё это будет конвертироваться в массив.
3. Возможно, имеет смысл обратить внимание на статические методы инициализации. С ними вы можете играть вообще как угодно:
public static Person createPetya(int age) {
return new Person("Petya", age, true);
}
Предложу другой вариант.
Прошу не холиварить просто вариант. Описывать все getters не стану лишь укажу как пользоваться setter.
public class Person {
String name;
int age;
boolean isMan;
public Person() {
}
public String getName(){...}
public Person setName(String name){
this.name = name;
return this;
}
public int getAge(){...}
public Person setAge(int age){
this.age = age;
return this;
}
.....
}
Тогда создание задание значений будет интересным.
Person vasya = new Person().setName('Вася');
Person ivan = new Person().setAge(25).setIsMan(true);
По сути у вас пустой конструктор. Он один а свойства задаёте через сеттеры которые паровозиком в любом порядке как хотите.
Вот статья использующая подход. Извините все не описал с телефона набираю