расширяет класс с помощью частного конструктора - PullRequest
44 голосов
/ 17 октября 2010

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

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() был приватным - мы получаем ошибку. Сколько стоит хороший пример и выход из этой ситуации?

Ответы [ 3 ]

45 голосов
/ 17 октября 2010

Выхода нет.Вы должны создать доступный (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();
    }
}
1 голос
/ 17 октября 2010

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

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

  • классы должны иметь название title case (Test вместо test)
  • Я бы предложил создать конструктор One private, если он не вызывается из другого класса в том же пакете
0 голосов
/ 27 февраля 2014

На самом деле я обнаружил, что есть выход.Например:

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 (), чтобы получить экземпляр расширенного класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...