2015-12-30 5 views
0

В настоящее время я пишу библиотеку, в которой пользователи могут создавать собственные подклассы родительского абстрактного класса Module. Так библиотека уже содержит некоторые модули, написанные мной, например ModuleOne, ModuleTwo, ...Создание объекта из класса

Каждый Module - подкласс должен быть легко идентифицировать с уникальным идентификатором, например, целое число, потому что я хочу сохранить несколько модулей конфигураций и соединений в XML-файле. Поэтому я могу загрузить сохраненные конфигурации позже и создать объекты требуемого типа.

Если я просто использовать предопределенные классы, это легко, потому что я знаю идентификаторы ModuleOne или ModuleTwo, так что я могу создавать модули в функции:

public static Module getModuleByType(int type) 
{ 
    if (type == ModuleOne.TYPE) 
     return new ModuleOne(); 
    else if (type == ModuleTwo.TYPE) 
     return new ModuleTwo(); 
    //and so on... 
} 

Но если пользователь делает подкласс Module , например CustomModule, как я могу назначить уникальные идентификаторы этому классу, чтобы все экземпляры этого класса имели одинаковый идентификатор типа?

Как я могу динамически воссоздать эти модули из своих идентификаторов? Поэтому я не могу создать модули в getModuleByType(), потому что я не знаю их конструктора и их идентификатора.

Благодарим за помощь.

+0

Если вы не знаете их конструкторы, вы никогда не сможете их создать, потому что вы не знаете, что означают параметры их конструкторов. – m0skit0

+0

Похоже, вы воссоздаете Spring IOC. –

ответ

2

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

Вообще говоря, вы не можете делать такую ​​вещь, поскольку подкласс может сильно отличаться от его родителя.

Если вы не знаете их конструкторы, вы никогда не сможете их создать, потому что вы не знаете, что означают параметры их конструкторов.

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

public static Module getModuleByType(final Class<? extends Module> moduleSubClass) { 
    Constructor<? extends Module> ctor = moduleSubClass.getConstructor(); 
    return ctor.newInstance(); 
} 

Хотя это медленнее, чем непосредственно делать new ModuleSubClass() и вы заставляете все подклассы иметь конструктор no-arg.

1

Вы можете использовать полное имя класса (с пакетами) в качестве идентификатора и воссоздать его с помощью этого

Class<?> clazz = Class.forName(className); 
Module module = (Module)clazz.newInstance(); 
+0

Работает только в том случае, если подкласс имеет конструктор no-arg. – m0skit0

+0

@ m0skit0 Эти объекты будут воссозданы из 'xml', поэтому у него должны быть стандартные конструкторы. –

+0

Это просто не имеет смысла. Это как сказать: Солнце желтое, поэтому помидоры красные. – m0skit0

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