Переопределенный вызов Java в конструкторе - PullRequest
5 голосов
/ 24 мая 2011

Я знаю, что это плохая практика (безопасность) - вызывать переопределенные методы из конструктора объектов в Java.Однако, например, если конструктор должен инициализировать некоторые данные, кажется разумным вызвать соответствующий метод установки, чтобы я не копировал код.Сеттеры являются публичными и не окончательными.Есть ли какой-нибудь стандартный способ справиться с этим, например, объявить частные методы установки, которые вызываются общедоступными?Для иллюстрации приведем код:

class A {
    private double x,y;
    private privateSetX(double x1) { x=x1; }
    private privateSetY(double y1) { y=y1; }
    public A() { privateSetX(0); privateSetY(0); }
    public setX(double x1) { privateSetX(x1); }
    public setY(double y1) { privateSetY(y1); }
};

Ответы [ 3 ]

2 голосов
/ 24 мая 2011

Если вы действительно хотите это сделать, создайте вторичный частный метод установки, который вызывается как конструктором, так и открытым сеттером.

2 голосов
/ 08 августа 2013

Лучший способ создать объект, который должен иметь множество различных полей, установленных во время построения, - это использовать Builder Pattern .

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

Если проблема в том, что вам нужно переопределить сеттеры во время конструктора, вы можете создать иерархию Builders вместо или в дополнение к иерархии первичного класса, который вы пытаетесь построить.

2 голосов
/ 24 мая 2011

Я думаю, что инициализация элементов данных напрямую в конструкторе является лучшей практикой. Если вы вызываете метод, то вам нужно посмотреть на реализацию этого метода, чтобы убедиться, что он действительно делает то, что выглядит так, как будто он делает. Если вы назначите элемент данных напрямую, вы знаете , что инициализация происходит. Итак, в вашем коде:

class A {
    private double x, y;
    public A() {
        x = 0;
        y = 0;
    }
    // ...
}

Конструктор обычно должен быть простым, детерминированным и, очевидно, правильным. Прямое назначение удовлетворяет этим целям.

...