我很难优雅地处理以下类:
假设我有以下A类:
class A{
B b1;
class B{
C c1;
D d1;
class C{
.
.
.
}
class D{
.
.
.
}
}
}
我也有AA级:
class AA{
B b1;
class B{
C c1;
E e1;
class C{
.
.
.
}
class E{
.
.
.
}
}
}
我需要创建和初始化A或AA的对象,具体取决于某些标志状态。 请注意,类A中的类B嵌套类D,而类AA中的类B嵌套类E!
我的自动思想是从一些基类派生它们并使用工厂。 然后我会得到一个我可以使用的对象,但是我将面临使用D或E对象的需要。 但我不确切知道如何实现这个想法。有可能吗?有没有更好的方法来实现它?
谢谢!
答案 0 :(得分:1)
一般来说,我会尝试避免多级内部类,因为它经常会创建非常复杂的代码。
在您的示例中,由于A
和AA
的字段类型为B
,因此无需使用内部类:
class Bar {
Foo foo;
static class Foo { // this is just a nested class now, it can easily be moved to top level
private Bar parent;
}
void setFoo(Foo foo) {
this.foo = foo;
foo.parent = this;
}
}
(上面只是一个简化的示例来显示机制,在实际代码中你应该进行额外的检查,即foo != null
以及如果foo.parent
已经设置为非 - 空值)
如果A
和B
都是不可变的,情况会略有不同,在这种情况下B
的实例化必须由A
严格控制。
答案 1 :(得分:1)
如果您需要以这种方式嵌套类,请先修改您的设计。如果你真的想坚持下去,你可以创建一个属性对象,并以编程方式(工厂?)实例化正确的对象。
class B{
C c1;
// ...
// possible a D & E parent class
Object X;
}
class A
B b1;
// ...
}
根据您的需要,您可以通过实例化方式将泛型和/或构造函数组合在一起,可以导致条件实例化(正确的B)。在这种情况下,在工厂中提供所有这些逻辑是有意义的恕我直言