Всегда выполнять некоторый код после перегруженных конструкторов - PullRequest
0 голосов
/ 28 февраля 2020

Я хочу, чтобы некоторый код (например, «setBackground (Color.BLACK);») выполнялся в каждом перегруженном конструкторе этого подкласса (или я также могу означать, что «некоторый код» должен выполняться после того, как экземпляр этого подкласса создано). Но этот «некоторый код» может использоваться / вызываться только внутри нашего подкласса и только один раз. И каждый перегруженный конструктор этого подкласса должен всегда вызывать соответствующий перегруженный конструктор суперкласса.

public class JLProgressBar extends JProgressBar{

    public JLProgressBar(){

        super();

    }

    public JLProgressBar(int orient){

        super(orient);

    }

    public JLProgressBar(int min, int max){

        super(min,max);

    }

    public JLProgressBar(int orient, int min, int max){

        super(orient,min,max);

    }

    public JLProgressBar(BoundedRangeModel newModel){

        super(newModel);

    }

}

Ответы [ 3 ]

1 голос
/ 28 февраля 2020

Преобразование комментария в ответ для использования в будущем.

Java Блоки инициализатора должны решить проблему. Они вводятся в каждый конструктор непосредственно после вызова super, который (в приведенных вами примерах) должен охватывать происходящее в подходящее время. Кроме того, они будут выполняться только один раз, и гарантированно будет запускаться для каждого создаваемого экземпляра (независимо от того, кто-то подклассирует ваш класс и т. Д. c.).

Например

public class YourJProgressBar extends JProgressBar {

    public YourJProgressBar() {
        super();
    }

    {
        // Whatever code you want in here, will run immediately after the call
        // to 'super' in any given constructor.  Note, in cases where the call
        // to 'super' is implicit, it will run after that implicit call
        // instead of just never running.
        this.setValue(10);
    }
}
0 голосов
/ 28 февраля 2020

Вы можете использовать инициализатор экземпляра. Этот инициализатор может обработать или ваш требуемый «некоторый код» для всех вариантов конструктора.

public class JLProgressBar extends JProgressBar{

    public JLProgressBar(){
        super();
    }

    public JLProgressBar(int orient){
        super(orient);
    }

    public JLProgressBar(int min, int max){
        super(min,max);
    }

    public JLProgressBar(int orient, int min, int max){
        super(orient,min,max);
    }

    public JLProgressBar(BoundedRangeModel newModel){
        super(newModel);
    }

    // instance initializer (called for every constructor
    {
        // "some code"
    }
}

Примечание: этот инициализатор экземпляра будет запускаться после супер-конструктора, но до любой другой код в конструкторе. Так что

public class Bar
{
    protected int a;

    public Bar()
    {
        a = 2;
        System.out.println(a);
    }

    {
        a = 1;
        System.out.println(a);
    }
}

public class Foo extends Bar
{
    public Foo()
    {
        super();
        a = 4;
        System.out.println(a);
    }

    {
        a = 3;
        System.out.println(a);
    }
}

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

... напечатает

1
2
3
4
0 голосов
/ 28 февраля 2020

Попробуй это. Блок static будет вызываться при каждой загрузке класса.


public class JLProgressBar extends JProgressBar{

    static {
        System.out.println("hhh");
    }

    public JLProgressBar(){
        super();
    }

    public JLProgressBar(int orient){
        super(orient);
    }

    public JLProgressBar(int min, int max){
        super(min,max);
    }

    public JLProgressBar(int orient, int min, int max){
        super(orient,min,max);
    }

    public JLProgressBar(BoundedRangeModel newModel){
        super(newModel);
    }
}
...