Как я могу использовать вновь добавленные аргументы конструктора класса в переопределенном методе, вызываемом во время конструктора суперкласса? - PullRequest
0 голосов
/ 17 февраля 2020

Если у меня есть класс Foo, который вызывает метод типа someMethod в своем конструкторе, и я хочу переопределить someMethod, чтобы использовать аргументы конструктора, которые я недавно добавил в этот подкласс, как я могу сделать это?

Предположим, что Foo имеет конструктор noargs, который вызывает someMethod. То, что я wi sh мог бы сделать , выглядит примерно так:

public class Bar extends Foo {
    private String x;
    private String y;
    public Bar(String x, String y) {
        this.x = x;
        this.y = y;
        super();
    }
    @Override
    public void someMethod() {
        // do stuff with x and y
    }
}

Конечно, я не могу этого сделать, потому что Java настаивает на том, что вызов конструктора суперкласса в первой строке конструктора подкласса. Если бы я переместил его в первую строку, он был бы вызван до инициализации x и y, и поэтому someMethod не использовал бы их значения, переданные в мой конструктор.

Кажется, я могу обойти это, используя inner классы, но это довольно ужасно.

public class Bar extends Foo {
    private String x;
    private String y;
    private Foo baz;
    public class Foobar extends Foo {
        @Override
        public void someMethod {
            // do stuff with Foo.this.x and Foo.this.y
        }
    }
    public Bar(String x, String y) {
        this.x = x;
        this.y = y;
        baz = new Foobar();
    }
    // override ALL of the remaining methods, including someMethod, delegating them to baz
}

Это ужасное решение, является ли это принятым шаблоном и есть ли лучший способ?

ПРИМЕЧАНИЕ. Чтобы уточнить, если это не очевидно, класс Foo не находится под контролем разработчика (например, он является частью сторонней библиотеки). Разработчик пытается расширить Foo, и поэтому любые проектные решения, принимаемые Foo (например, неконечный метод, вызываемый из конструктора), не являются вещами, на которые может повлиять разработчик.

РЕДАКТИРОВАТЬ: Люди спрашивают в комментарии, если someMethod является приватным. Это не личное, если бы это было так, я бы не смог это переопределить Вот пример указанного класса Foo для иллюстрации:

public class Foo {
    public Foo() {
        // some other stuff...
        someMethod();
    }
    public void someMethod() {
        // nothing of consequence
    }
    // some other methods, which aren't relevant to the question
}
...