Что сделать чтобы в конструкторе не было много параметров

135
25 января 2020, 19:00

Всем привет! Есть такой конструктор который считывает информацию о квартире:

public Flat(Address flatAddress, double flatArea, boolean furnishing, int bedroomsNum, double flatPrice, List<InfrastructureObject> infrustructure)

Также есть конструкторы Адреса:

public Address(String country,String town,String street,int houseNumber)

И конструктор инфраструктуры:

 public InfrastructureObject(InfrastructuresType infrastructuresType,String infrastructureObjectName,double distance)

в итоге , когда я создаю квартиру(объект) получается огромный конструктор вроде этого:

Flat flat1 = new Flat(new Address("Great Britain", "London", "Linkoln St.", 25), 290,
                true, 4, 750, new LinkedList<>(Arrays.asList(
                new InfrastructureObject(InfrastructuresType.SCHOOL, "School №19", 900),
                new InfrastructureObject(InfrastructuresType.HYPERMARKET, "Victoria Gardens hypermarket", 800))));

Как можно сократить такой конструктор, дабы он занимал меньше места по скольку в будущем мне надо будет создавать список квартир? Спасибо за предложения!!!

Answer 1

В зависимости от того объект у вас должен ли быть неизменяемый и все ли параметры должны быть проиницилизированны.

  1. Можно сделать конструктор без параметров и использовать set-ры
    • ваш объект будет изменяемы - что не всегда хорошо
  2. Можно применить билдер паттерн
  3. Для списков можно использовать add методы
    • например для Flat можно добавить метод что-то типа addInfrastructureObject(InfrastructureObject infrustructure)
Answer 2

Во-первых, хардкодить конкретные названия прямо в Java - это значит самому себе проблемы в будущем создать. Надо объекты создавать из БД - ну на крайний случай с текстового файла. Тогда и код будет выглядеть более компактным автоматически.

Во-вторых, InfrastructuresType.SCHOOL - не очень хорошее решение с позиции ООП - потому что в методах Вам тогда придется писать "если тип такой-то то делай это, иначе если тип такой-то ..." - во что потом превращаются такие методы видел неоднократно. Намного лучше и короче просто new School(), причем в нем не надо будет тип проверять - у каждого объекта свой переопределенный метод.

В-третьих, new LinkedList<> - это тоже не очень хорошо. Например, есть документ, а есть журнал документов - это разные сущности со своим поведением и свойствами. Думаю то же самое есть и в Вашем случае.

Если хотя бы эти три рекомендации используете - код значительно сократится и будет намного более читаемым.

Answer 3

Могу предложить использовать паттерн Fluent Interface. Он похож на Builder. Суть такова - в классе, для которого у вас пишется такой большой конструктор, вы должны объявить пустой публичный конструктор по умолчанию + set методы для каждой переменной, которые возвращают this. Пример:

class ClassA {
  ...
  public ClassA setVar1(... var1) {
    this.var1 = var1;
    return this;
  }
  ...
}

В итоге, при создании объекта вам нужно будет сделать так:

ClassA a = new ClassA()
             .setVar1(...)
             .setVar2(...)
             .setVar3(...);
READ ALSO
Как скопировать строку из одного метода в другой

Как скопировать строку из одного метода в другой

У меня есть два класса, один из которых mainВ последнем хранится переменная Name

154
Проблема с flat jar - Could not find or load class. Error

Проблема с flat jar - Could not find or load class. Error

Пытаюсь собрать запускаемый flat jar с помощью maven, каждый раз натыкаюсь на граблиЯ собрал все то что нагуглил/подсказали в кучу и засунул в корневой...

132
Проблема с тегом descriptorRefs, idea не видит его

Проблема с тегом descriptorRefs, idea не видит его

Хотел разобраться с созданием и запуском jar файловСобрал в кучу что нашел что нужно в pom по этому, но уже в idea получил вот такую проблемку - тег...

134
TextRecognizer - совместимость на разных устройствах

TextRecognizer - совместимость на разных устройствах

Всем привет! Сделал приложение с TextRecognizerПриложение прекрасно работает и определяет текст на Xiaomi Redmi4

122