我有一个班级说'A',一个对象'a'创建一个'B'类对象'b'。现在'b'运行一个想要创建b的父实例的方法(请不要将它与继承混淆) - 创建'b'的类,这里是'A'。
这在Java中是否可行?或者也许一些设计建议可能有用。
谢谢!
编辑:根据建议,我也在添加我的设计要求。我有一个“ExitController”类,它根据调用函数的不同而工作 - 就像它被UserX调用一样,它会终止程序,如果它由UserY调用它会将其记录下来,等等。 通常我应该在我的用户界面中放置一个ExitController方法,但由于我不能使用一些约束。此外,与它提供的使用相比,传递父对象/类名看起来非常昂贵。
答案 0 :(得分:5)
基本上,您必须将传递父本身或父类型传递给B的构造函数。以下示例说明了最后一种情况。
class A {
B b;
A() {
b = new B(getClass());
}
}
class B {
Class<?> parentClass;
B(Class<?> parentClass) {
this.parentClass = parentClass;
}
void createParent() throws Exception {
Object o = parentClass.newInstance();
}
}
使用generics,您可以使其更安全。但由于功能要求并不完全清楚,我已经离开了。
更新,创建实例毫无意义。您可以检查类类型并相应地处理。而不是上面示例中的createParent()
,请执行:
void exit() {
if (parentClass == UserX.class) {
// Terminate program.
} else if (parentClass == UserY.class) {
// Logoff user.
}
}
然而,这很简单。您是否真的 不允许向User
界面添加其他方法?否则以下是更好的设计(称为Strategy pattern):
interface User {
void exit();
}
class ExitController {
void exit(User user) {
user.exit();
}
}
class UserX implements User {
public void exit() {
// Terminate program.
}
}
class UserY implements User {
public void exit() {
// Logoff user.
}
}
根据你上次的陈述:
此外,传递父对象/类名与其提供的用途相比看起来非常昂贵
这没有任何意义。你测量过吗?向我们展示结果。
答案 1 :(得分:0)
如果我正确理解您的问题,我认为课程B
必须存储对象a
或A.class
的引用。这将允许b
构建A
的新实例。最简单的方法是让B
的构造函数获取类参数。