У меня возникает странная проблема. У меня есть интерфейс, реализация которого имеет тенденцию быть апатридом. Поэтому я хочу, чтобы они были одиночными.Как получить экземпляр singleton из имени класса в виде строки
Я получаю имена классов реализации как строки. Например
String clazz = "com.foo.Bar";
У меня есть правила завод, чтобы получить экземпляры IRule
реализаций.
public class RulesFactory {
private static final Logger logger = LoggerFactory.getLogger(RulesFactory.class);
@SuppressWarnings("unchecked")
public static <T extends IRule> T getRuleInstance(String clazz) {
try {
Class<?> ruleObject = Class.forName(clazz);
Method factoryMethod = ruleObject.getMethod("getInstance");
return (T) factoryMethod.invoke(null);
} catch (ClassNotFoundException e) {
logger.error("ClassNotFoundException", e);
} catch (IllegalAccessException e) {
logger.error("IllegalAccessException", e);
} catch (SecurityException e) {
logger.error("SecurityException", e);
} catch (NoSuchMethodException e) {
logger.error("NoSuchMethodException", e);
} catch (IllegalArgumentException e) {
logger.error("IllegalArgumentException", e);
} catch (InvocationTargetException e) {
logger.error("InvocationTargetException", e);
}
return null;
}
}
Приведенный выше код бросает NullPointerException
, если класс не имеет статический getInstance()
метод. В Java 6 я не могу использовать статические методы в интерфейсах. Я не хочу создавать несколько экземпляров реализаций IRule
. Если я могу применить статический метод и вызвать этот статический метод, я получу экземпляр с обложкой. Но я не могу этого сделать. Как решить эту проблему?
Другая идея: иметь реализации с защитой конструкторов. Имейте их в том же пакете, что и RulesFactory, а затем на основе clazz создайте «новую» реализацию и сохраните ее на карте по имени класса. Всегда проверяйте карту перед созданием нового экземпляра. – Blitzkr1eg
Null - допустимое значение, которое нужно передать, чтобы вызвать **, если ** метод является статическим. Поэтому проверьте методы 'getInstance()'. – Kayaman
@ Кайаман Да. Это действительно. Но как обеспечить, чтобы getInstance выполнялся клиентами, а также как статический метод? – phoenix