2012-04-25 2 views
0

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

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

Скажем, например, что исходный пакет pack1 и новая версия pack2, с именами классов pack1.Factory и pack2.Factory. Выбор pack1 или pack2 будет задан с помощью простого параметра в файле свойств. Кроме того, тип MyClass является общим для обоих пакетов, и следует использовать только обычную ванильную Java (т. Е. Сторонние библиотеки).

Я думаю об использовании Class.forName() для загрузки pack1.Factory или pack2.Factory (в зависимости от указанного свойства), а затем путем вызова всех методов фабрики путем отражения.

Это лучший подход?

ответ

3

Это почти классическая утилита для инъекции контроля. Guice должно начаться в кратчайшие сроки.

Необходимо иметь интерфейс, такой как IFactory, с некоторым заводским методом create. Создайте два модуля Guice - в одном соединении IFactory до pack1.Factory, а в другом - до pack2.Factory. Конечно, обе эти фабрики должны реализовать IFactory.

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

-1

Вам следует избегать отражения там, где это возможно. Это делает ваш код сложнее понять, сложнее реорганизовать и усложнить работу.

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

+0

Я не согласен. Отражение, если используется добросовестно, прекрасно. Я думаю, было бы вполне уместно использовать его здесь. – ControlAltDel

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