gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 07:00:40 25 4
gpt4 key购买 nike

我有一个关于可能不可能的事情的问题,但值得一试。

我有这些类(class):

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;
}
}

如您所见,我需要始终在构造函数结束时自动调用 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()!
}
}

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

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

现在,考虑这个问题,也许如果我能检测到父类(super class)中调用了构造函数,我就能检测到我是否可以调用该方法。

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.

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

最佳答案

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

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

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;
}
}

关于java - 在最后一个构造函数结束后调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26705396/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com