在最后一个构造函数结束后调用方法

Mar*_*o S 1 java constructor

我对可能无法实现的事情有疑问,但值得一试.

我有这些课程:

Class A {
    private int x = 0;

    public A() {
        afterCreate();
    }

    public void afterCreate() {
        x = 10;
    }

    public int getX() { 
        return x; 
    }
}

Class B extends A {
    public B() {
        super();
        //Do something
        afterCreate();
    }

    @Override
    public void afterCreate() {
        x = 20;
    }
}

Class C extends B {
    public C() {
        super();
        //Do something
        afterCreate();
    }

    @Override
    public void afterCreate() {
        x = 30;
    }
}
Run Code Online (Sandbox Code Playgroud)

如您所见,我需要始终afterCreate()在构造函数结束时自动调用.但是如果我只是afterCreate()在每个构造函数内部调用,你可以看到对于从类创建的对象C,我们将调用该方法afterCreate()三次(每个构造函数一个) - 前两个调用是无用的.

另外,我不能afterCreate()只在第一个构造函数中调用,因为afterCreate()必须在最后一个构造函数之后执行.

Class A {
    public A() {
        //Do something
        afterCreate();
    }
}

Class B extends A {
    public B() {
        super();
        //Doing something that I missed to process in afterCreate()!
    }
}

Class C extends B {
    public C() {
        super();
        //Doing something that I missed to process in afterCreate()!
    }
}
Run Code Online (Sandbox Code Playgroud)

显然,我无法调用afterCreate()类C的构造函数,因为如果我从类A或B创建对象,则不会调用该方法.

有没有办法可以afterCreate()在LAST构造函数结束时自动调用?

现在,考虑到这个问题,也许如果我能检测到在超类中调用构造函数,我可以检测是否可以调用该方法.

Class A {
    public A() {
        //Do something
        if(thisIsNotCalledAsASuperClass()) afterCreate();
    }
}

Class B extends A {
    public B() {
        super();
        //Do something
        if(thisIsNotCalledAsASuperClass()) afterCreate();
    }
}

Class C extends B {
    public C() {
        super();
        //Do something
        if(thisIsNotCalledAsASuperClass()) afterCreate();
    }
}

//Class D extends C {
//etc.
Run Code Online (Sandbox Code Playgroud)

我不知道......你怎么看?

Pet*_*rey 6

这是一个坏主意.它通常被认为是构造函数的反模式,用于调用基于子类更改行为的方法.

如果您确实需要此功能,我建议在每个类上使用工厂方法,并阻止直接访问构造函数.问题是您正在为未完全初始化的实例调用可覆盖的方法.

Class A {
    private A() {
        //Do something
    }
    public static A newA() {
        A a = new A();
        a.afterCreate();
        return a;
    }
}

Class B extends A {
    private B() {
        super();
    }
    public static B newB() {
        B b = new B();
        b.afterCreate();
        return b;
    }
}

Class C extends B {
    private C() {
        super();
        //Do something
    }
    public static C newC() {
        C c = new C();
        c.afterCreate();
        return c;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 哦,这是一个解决方案,但我会遵循你的建议,我不会尝试做那样的事情.我将再次审查设计,以确保我需要以这种方式进行.谢谢! (2认同)