Как я могу создать новый экземпляр подкласса из статического метода в его суперклассе в Java?

#java #inheritance #abstract-class

#java #наследование #абстрактный класс

Вопрос:

У меня есть абстрактный одноэлементный класс, и я хочу, чтобы в нем было instance поле, представляющее экземпляр синглтона. Я пытался сделать это:

 public abstract class AbstractClass {
    private static AbstractClass instance;

    public static AbstractClass getInstance() {
        return instance == null ? this.getClass().newInstance() : instance;
    }    
}
 

Я хочу, чтобы это функционировало так, чтобы при вызове его из подкласса AbstractClass он возвращал экземпляр этого подкласса, а не экземпляр AbstractClass , поэтому я попытался использовать this#getClass() вместо just AbstractClass . Это, конечно, выдает мне сообщение об ошибке «Невозможно использовать это в статическом контексте». Есть ли способ, которым я могу сгенерировать новый экземпляр подкласса в статическом методе в его суперклассе?

Комментарии:

1. Я так не думаю.

Ответ №1:

this не может использоваться внутри static метода, потому что нет явного объекта для разрешения this ссылки.

В дополнение к этому ограничению Parent class не знает о возможных подклассах (если sealed только), которые могут расширяться из него.

Таким образом, он не может создать явный экземпляр подкласса.

Исходя из вашей проблемы, вы можете захотеть использовать некоторую форму Factory шаблона для управления созданием объекта. (или другой шаблон создания)