2009-05-25 2 views
0

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

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

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

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

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

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

Спасибо!

+0

Я бы начал с того, что подумал, действительно ли этот XML-файл - это то, что вы хотите сделать. –

+0

Хм, как-то мне нужно выяснить, какие у меня классы Controller.Но вы можете быть правы, хотя я попытался создать своего рода модульную систему, и я все еще участвую в учебе, поэтому не мог бы быть слишком презентабелен для мира: P – letmaik

ответ

4

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

+0

+1 для вещей типа Guice. Второй вариант - двухфазное. Вы имели в виду третий вариант? –

+0

Спасибо! Я уже немного побывал в Guice некоторое время назад, но до сих пор я до сих пор не понял, что это то, что я уже делаю - просто вручную. Проблема в том, что это уже для уже разработанного университетского проекта. Я хотел бы использовать его, но я думаю, что это будет невозможно. Я думаю, что буду придерживаться решения на заводе. – letmaik

+0

Просто небольшое примечание. Я использую Guice в новом проекте, и мне это нравится. Так что спасибо за рекомендацию! – letmaik

0

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

2

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

+0

+1 для весны. Некоторые примеры конфигураций Spring: http://static.springframework.org/spring/docs/2.0.x/reference/beans.html#beans-some-examples –

+0

+1 Для весны. Кажется, вы пытаетесь написать собственную инъекцию зависимости. Есть много (Весна, Guice, Seam, просто чтобы назвать несколько), так что это довольно избыточно. –

+0

Выглядит также довольно интересно, я обязательно буду использовать такую ​​структуру в следующий раз, но на данный момент было бы слишком много работы по интеграции одного из них, как я объяснил в комментарии относительно Guice. – letmaik

0

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

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

+0

Хм кажется немного взломанным, с этим мне нужно будет принудительно ввести определенные имена полей или поместить их в xml тоже. – letmaik

Смежные вопросы