Если идентификаторы произвольно выбраны клиентским кодом, тогда невозможно будет узнать, какой идентификатор принадлежит какому подклассу атрибута. Однако, если вы можете каким-то образом применять шаблон, то да, было бы возможно создать экземпляры подклассов, только зная идентификатор. Вы можете сделать это с помощью отражения.
Пример кода ниже, как создать новый экземпляр с помощью отражения:
public void createInstanceOfSubclass(String id) {
try {
Class cls = Class.forName(convertIDToClassName(id));
Class parameterTypes[] = new Class[1];
parameterTypes[0] = String.TYPE;
Constructor ct = cls.getConstructor(parameterTypes);
Object arglist[] = new Object[1];
arglist[0] = id;
Object subclassInstance = ct.newInstance(arglist);
}
catch (Throwable e) {
System.err.println(e);
}
}
[Это просто пример кода; например, обработка ошибок может быть улучшена в реальной реализации.]
По сути, вам придется написать метод convertIDToClassName (String) для преобразования идентификатора в имя класса. Без такой ассоциации было бы невозможно связать их.
Другая идея заключается в том, что идентификатор атрибута рассчитывается вами; Это означает, что класс Attribute устанавливает свое собственное поле ID. В результате вы напрямую связываете имя подкласса и поле ID вместе. Следовательно, было бы возможно создавать экземпляры подклассов через идентификатор.
В любом случае, личным комментарием будет избегать рефлексии и придерживаться создания классов в коде (вероятно, извлеките код создания экземпляра где-нибудь, как в фабричном классе, так что ваш основной код будет закрыт для модификации ).