Инициализация объекта со ссылками без доступа к конструктору не по умолчанию - PullRequest
0 голосов
/ 25 мая 2009

Предположим, у меня есть интерфейс с именем «Контроллер». Несколько классов реализуют этот интерфейс, и я не знаю этих классов (например, имена классов находятся в xml-файле). Теперь, чтобы эти классы, реализующие контроллер, работали, им нужно получить ссылки на другие объекты (возможно, объекты данных). И это мой вопрос, а именно, каков наилучший способ инициализации таких объектов (объектов Controller)?

Я подумал о нескольких решениях, но я не совсем уверен, какой здесь лучший подход.

Первый : При создании экземпляра объекта из имени класса я мог бы искать «специальный» конструктор (с помощью отражения), который имеет ссылки на объекты, необходимые объекту Controller. Но из того, что я прочитал в других вопросах, это менее вероятно хорошее решение, потому что я бы заставил специальный конструктор существовать в классе. И иногда я читаю, что размышления вообще являются злом и их лучше избегать.

Второй : Я добавляю специальный метод init (a, b, c) к интерфейсу Controller, который должен вызываться непосредственно после создания объекта. Это заставило бы последовательность вызовов (сначала init (..), затем rest) к объекту, чтобы заставить его работать, что, вероятно, тоже плохо. Кстати, init () - методы вообще плохо в интерфейсах?

Третий : После прочтения этого комментария я подумал о следующем: вместо того, чтобы иметь имя класса класса, реализующего интерфейс контроллера (в файле xml), у меня есть имя класса фабрики, которая принадлежит конкретному классу контроллеров. И эта фабрика будет реализовывать интерфейс с методом createController (a, b, c), и тогда фабрика будет знать, какой класс ей нужно создать, а также какой конструктор будет вызывать для переноса других ссылок (например, объектов данных). Недостатком этого может быть дополнительный класс только для создания экземпляра класса Controller и, возможно, небольшие накладные расходы в целом.

Какой, по вашему мнению, лучший способ сделать это? Или вы можете придумать что-то еще, что может быть лучше, чем эти три способа?

Спасибо!

Ответы [ 4 ]

4 голосов
/ 25 мая 2009

Из упомянутых вами подходов я бы выбрал второй (заводской). Однако, поскольку то, что вы делаете , является формой внедрения зависимости, также рассмотрите Guice, http://code.google.com/p/google-guice/ - это может позволить вам автоматизировать большую часть этой работы.

2 голосов
/ 25 мая 2009

То, что вы пытаетесь сделать, очень похоже на то, что делает Spring. В вашем XML-файле ваш узел контроллера будет иметь дочерние узлы для указания свойств, которые будут установлены. Ваш контроллер устанавливается путем вызова конструктора по умолчанию. Затем свойства устанавливаются с помощью отражения.

0 голосов
/ 25 мая 2009

Другим вариантом может быть использование Unsafe.allocateInstance (Class) для создания экземпляров без вызова конструктора. Вы можете установить поля, используя отражения.

Предполагается, что ваши конструкторы не имеют побочных эффектов.

0 голосов
/ 25 мая 2009

Что-то похожее на другом языке, я знаю, что я использовал решение init ().

...