Избегая «утечки этого», избегая большого количества фабрик

#java #constructor #factory-method

#java #конструктор #factory-метод

Вопрос:

У меня есть абстрактный класс, AbstractClass который в конечном итоге объединяет большое количество final конкретных классов A и B т. C Д. «В конечном счете», как и в некоторых случаях, существует промежуточный абстрактный класс — D1 и D2 оба расширяются AbstractD , который расширяется AbstractClass , например. Во время создания объекта каждый из этих конкретных классов должен быть связан с одним (и только одним) экземпляром одного из конкретных классов: возможно, того же класса, возможно, другого. Каждый конкретный класс также имеет большое количество конструкторов.

Кодирование этого как:

 public A(String aVariable, int anotherVariable, AbstractClass objectToBeLinked){
   //do some stuff with other variables;
   owner = objectToBeLinked;
   objectToBeLinked.addToInventory(this);
}
 

и затем другие подписи конструктора по мере необходимости дадут мне некоторое Leaking this in Constructor время, я понимаю, что это не обязательно недостаток, я хотел бы избежать этого — для безопасности потоков, а также просто для использования лучших практик. Лучшее решение, которое я вижу, — это реализовать какую-то форму фабричного метода:

 public static void createObjectA(String aVariable, int anotherVariable, AbstractClass objectToBeLinked){
    a = new A(String aVariable, int anotherVariable, AbstractClass objectToBeLinked);
    objectToBeLinked.addToInventory(a);
}
 

(например, реализация, очевидно, может отличаться), чтобы гарантировать, что создание объекта завершено до того, как оно будет связано. Однако, учитывая большое количество конкретных классов и большое количество конструкторов, которые есть у каждого, это означало бы создание огромного количества фабричных методов. Если это лучшее решение, то пусть будет так, но мне интересно, есть ли лучший метод, которого я не вижу.

Комментарии:

1. Не используйте ctor, используйте шаблон static factory. Как и предполагалось. Если у вас много ctors с разными параметрами; замените шаблоном builder.