Вопрос по constructor, java – Несколько необязательных аргументов в конструкторе в Java - экспоненциальное число конструкторов

2

Это то, с чем я сталкивался несколько раз и пока не смог найти удовлетворительного ответа. Это кажется довольно глупым, но после того, как я на некоторое время погуглил с этим, я не смог придумать что-то хорошее.

Допустим, у меня есть класс с 20 переменными экземпляра, каждая из которых является необязательной (будет инициализирована или нет).

Теперь я хочу, чтобы мой конструктор (-ы) обрабатывал все случаи, в случае нескольких переменных экземпляра это нормально, и я могу просто создавать конструкторы с разными сигнатурами, но здесь у меня есть 20, поэтому мне нужно2^20=1,048,576 конструкторы для обработки всех случаев! Это кажется ... не очень оптимальным, не так ли?

Так как с этим подходом грубой силы я в основном должен построить 2 ^ n конструкторов, где n - количество переменных экземпляра, я хочу найти лучший способ сделать это.

Я видел пару решений этой проблемы, но я полагаю, что все они основаны на предположениях о данных, но в моем случае каждая из этих переменных может быть инициализирована или не случайна, у меня нет возможности узнать это до инициализации.

Я ищу некоторые шаблоны проектирования или идеи, которые я мог бы применить, чтобы сделать мой код немного ... более легким в обслуживании (не волнуйтесь, я не создавал конструкторы 1M + :)

Благодарю.

бобовый узор. Конструктор не имеет аргументов, все параметры проходят через сеттеры. bmargulies
это кажется глупым, я сказал, что у меня есть 20 переменных экземпляра, но на самом деле у меня есть больше, я не хочу вызывать 20 разных сеттеров! Это может быть в несовместимом состоянии во время его выполнения, это кажется очень плохим решением. Charles Menguy
И это также запрещает мне делать свой класс неизменным. Charles Menguy

Ваш Ответ

3   ответа
7
+1 для обмена :)
5

Объедините Бобовый образец с Строителем. YourObject не будет иметь несовместимого состояния в середине своей конструкции, но он все равно будет выполнять более 20 операций над множествами, и вы можете сделать YourObject неизменным (если хотите), но не YourObjectBuilder.

public class YourObject {
    private Type field1;
    private Type field2;
    private Type field3;
    ...
    YourObject ( Type field1 , Type field2 , Type field3 ... ) { }
}

public class YourObjectBuilder {
    private Type field1;
    private Type field2;
    private Type field3;
    ...

    public YourObjectBuilder() {
    }

    public YourObject make ( ) {
         return new YourObject ( field1 , field2 , field3 ... ) ;
    }

    public void setField1(Type t) {
        field1 = t;
    }

   public void setField2(Type t) {
        field2 = t;
   }

    public void setField3(Type t) {
        field3 = t;
    }
    ...
}
+1 - это то, что делает IntelliJ.
Это звучит как хорошее решение и намного лучше, чем образец Бина, спасибо! Charles Menguy
0
public class YourObject {
    private Type field1;
    private Type field2;
    private Type field3;
    ...

    public YourObject() {
    }

    public void setField1(Type t) {
        field1 = t;
    }

   public void setField2(Type t) {
        field2 = t;
   }

    public void setField3(Type t) {
        field3 = t;
    }
    ...
}
Я больше говорил в многопоточном контексте. Вы правы, я мог бы гарантировать, что объект не будет доступен до того, как он будет построен, но это требует некоторых дополнительных усилий для обеспечения безопасности потока. Charles Menguy
@linker Объект будет находиться в несогласованном состоянии во время его создания только в том случае, если вы передадите его другому методу до того, как закончите его создание. Если вам нужно беспокоиться об изменчивости, вы можете создать флаг, чтобы определить, можно ли устанавливать поля, и переключать его, когда вы закончите создание своего объекта.
Как я уже говорил в комментарии выше, проблема с этим видом или подходом заключается в том, что мой объект может находиться в несогласованном состоянии в процессе его построения! Это очень опасно в моем случае, и я не могу себе этого позволить. И вы должны сделать свой класс изменчивым, чего я не хочу. Charles Menguy

Похожие вопросы