Сократить код повторяющихся конструкторов

Знатоки. Я только начинаю программировать, поэтому приходится задавать такие примитивные вопросы. Вот один из них.

  • У меня есть класс который оперирует несколькими переменными.

  • Мне крайне не приятно повторять конструктор для каждого варианта определенности переменных. В одном случае конструктор по умолчанию, переменные без определения, в другом, одна переменная задается в конструкторе, в третьем две и так по нарастающей последовательности.

  • И каждый раз я вынужден дублировать конструктор, вместо того чтобы внутри конструктора задать условия и соответствующие значения. Т.е. несколько конструкторов заменить одним.

  • Я догадываюсь, что практики не повторяют свой код и пользуются одним конструктором с пустыми входящими полями(по умолчанию) и одним с переменным количеством заданных полей. -Мне очень интересно как Вы это делаете))) Заранее благодарю. Всем хорошего настроения.

Пример кода прост:

паблик класс Кот() {
    поле 1, поле 2, поле 3;
    конструктор Кот () {}
    конструктор Кот (поле 1, поле 2) {
        зис.поле 1 = поле 1;
        зис.поле 2 = поле 2;
    }
    конструктор Кот (поле 1, поле 2, поле 3) {
        зис.поле 1 = поле 1;
        зис.поле 2 = поле 2;
        зис.поле 3 = поле 3;
    }
    и т.д.
}

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

Автор решения: Zhenyria

Насколько я понимаю, основная проблема в том, что вам не нравится большое количество кода из-за конструкторов. Возможные решения проблемы:

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);
    }
→ Ссылка
Автор решения: Aziz Umarov

Предложу другой вариант.

Прошу не холиварить просто вариант. Описывать все 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);

По сути у вас пустой конструктор. Он один а свойства задаёте через сеттеры которые паровозиком в любом порядке как хотите.

Вот статья использующая подход. Извините все не описал с телефона набираю

→ Ссылка