Вопрос наследования Java - PullRequest
3 голосов
/ 29 июня 2011

Скажем, я расширяю класс и переопределяю метод в этом классе. Почему плохой практикой является вызов переопределенного метода из конструктора моего нового класса?

Ответы [ 5 ]

12 голосов
/ 29 июня 2011

Основная причина не вызывать переопределенные методы из конструкторов заключается в том, что он позволяет подклассам видеть класс в полусозданном состоянии.Это может быть или не быть угрозой безопасности, но это ошибка, ожидающая своего появления.Подробнее здесь .

5 голосов
/ 29 июня 2011

Работа в конструкторе обычно плохая практика - просто получить и назначить объектные зависимости.

3 голосов
/ 29 июня 2011

Поскольку результирующий экземпляр класса может находиться в несогласованном состоянии. Вот конкретный пример.

public class Foo {
    private int number;

    public Foo() {
        number = 42;
        multiplyNumber();
    }

    public void multiplyNumber() {
        number = number * 2;
    }

    public int getNumber() {
        return number;
    }
}

public class Bar extends Foo {

    private int number;

    public Bar() {
        multiplyNumber();
    }

    @Override
    public void multiplyNumber() {
        number = number * 3;
    }
}

public class FooBar {

    public static void main(String[] args) {
        Foo foo = new Foo();
        Foo bar = new Bar();
        System.out.println("Foo number 1 = " + foo.getNumber()); // Returns 84
        System.out.println("Foo number 2 = " + bar.getNumber()); // Returns 42; 
    }
}

При выполнении отладки на моем компьютере bar никогда не вызывает метод multiplyNumber() в конструкторе; это просто пропускается. В результате объект не имеет ожидаемого значения в number.

Конструкторы должны быть простыми существами; лучше не ставить там ничего сложного.

3 голосов
/ 29 июня 2011

Кто-то может унаследовать от вашего класса и изменить поведение, на которое вы полагаетесь в своем конструкторе.

Это означает, что вы не знаете, что собирается делать эта функция.

1 голос
/ 29 июня 2011

Представьте, что вы вызываете переопределенный метод в своем конструкторе.Вы снова подкласс и снова переопределить.Второй подкласс может прервать работу, от которой зависит ваш первый подкласс, и будет считаться полностью инициализированной, оставляя его в поврежденном состоянии.

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

Для лучшей практики избегайте наследования все вместе, и если вы решите разделить работу конструктора на методы, используйте видимостьмодификаторы, гарантирующие, что вся эта работа остается локальной для создаваемого класса.

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