Подтвердить что ты не робот

Расширяет класс с помощью частного конструктора

Предположим, что у нас есть следующий код:

class Test {
    private Test() {
        System.out.println("test");
    }

}

public class One extends Test {

    One() {
        System.out.println("One");
    }

    public static void main(String args[]) {

        new One();
    }
}

Когда мы создаем объект One, который изначально назывался конструктором родительского класса Test(). но поскольку Test() был закрытым - мы получаем ошибку. Насколько хороший пример и выход из этой ситуации?

4b9b3361

Ответ 1

Нет выхода. Вы должны создать супердоступный конструктор (protected, public или по умолчанию), чтобы иметь возможность расширять test.

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

Если у вас есть class только с конструкторами private, вы также можете изменить class на final, потому что он не может быть вообще расшифрован.


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

class Test {
    private Test() {
        System.out.println("test");
    }
    public static Test getInstance(){
        return new Test();
    }
    public void methodA(){
        //Some kind of implementation
    }
}

public class One {
    private final Test test;
    One() {
        System.out.println("One");
        test = Test.getInstance();
    }

    public void methodA(){
        test.methodA();
    }

    public static void main(String args[]) {
        new One();
    }
}

Ответ 2

Сделайте конструктор test не private или переместите One в test.

Кстати, ваш пример кода содержит несколько проблем:

  • классы должны быть названы заголовком (test вместо test)
  • Я предлагаю создать конструктор One private, если он не вызван из другого класса в том же пакете

Ответ 3

На самом деле, я нашел выход. Вот так:

class Base {
private Base() {

}

public void fn() {
    System.out.println("Base");
}

public static class Child extends Base {
    public void fn() {
        System.out.println("Child");
    }
}

public static Base getChild() {
    return new Child();
}}

Теперь вы можете использовать getChild() для получения экземпляра расширенного класса.