我对可能无法实现的事情有疑问,但值得一试.
我有这些课程:
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)
我不知道......你怎么看?
这是一个坏主意.它通常被认为是构造函数的反模式,用于调用基于子类更改行为的方法.
如果您确实需要此功能,我建议在每个类上使用工厂方法,并阻止直接访问构造函数.问题是您正在为未完全初始化的实例调用可覆盖的方法.
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)
| 归档时间: |
|
| 查看次数: |
1271 次 |
| 最近记录: |