Отражение Java плохая картина? - PullRequest
2 голосов
/ 24 июня 2010

Допустим, у меня есть много похожих классов (в данном примере Units в RTS), то есть класс Unit и подклассы UnitA, UnitB, UnitC и т. Д.

Все классы модулей имеют следующий конструктор (включая Unit)

public class UnitX {
    public UnitX(FileReader fr) {
         ...read parameters for constructing the unit...
    }
}

Мой файл, содержащий параметры, имеет вид

UnitX params
UnitY params
....

и создает список всех модулей в файлебудет цикл while, подобный

Class[] params = {FileReader.class};
while(fr has more to read) {
    String unitType = fr.getString();
    Unit u = (Unit)
java.lang.reflect.Constructor constr = Class.forName(unitType).getConstructor(params);
    Unit u = (Unit)constr.newInstance(new Object[]{fr});
    list.add(u);
}

Я понял, что очень часто использую этот шаблон, когда создаю объекты из файлов.Мой вопрос, это плохая картина?Есть ли лучший способ сделать это?

Ответы [ 4 ]

3 голосов
/ 24 июня 2010

То, что дело для фабричного шаблона :

java.lang.reflect.Constructor constr = Class.forName(unitType).getConstructor(params);
Unit u = (Unit)constr.newInstance(new Object[]{fr});

может быть изменено на

Unit u = UnitFactory.create( unitType, fr );

Заводом тогда является список if / else, хотя,

2 голосов
/ 24 июня 2010

Сам код в порядке. Поскольку конструкторы не могут быть частью традиционного кодифицированного интерфейса, следующая лучшая вещь - это последовательный отражающий интерфейс.

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

Это позволяет повторно использовать и отделять чтение файла от экземпляра и метод создания экземпляра.

1 голос
/ 24 июня 2010

Я думаю, что ваша реализация в порядке.Другой подход: текстовый файл представляет собой простую форму DSL (предметно-ориентированный язык)

Вы можете переключиться на более динамический язык, совместимый с jvm.Динамические языки, такие как groovy (мой любимый ;-)), javascript (Rhino, ...), BeanShell, jython, ... могут более легко использоваться для реализации языков, специфичных для домена (DSL).Для более сложных DSL вы можете взглянуть на проект eclipse XText.

0 голосов
/ 24 июня 2010

Это простая, урезанная сериализация.Я бы сказал, что это хорошо, если это соответствует вашим целям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...