我有一个简单的场景。我想在下面创建一个新类的实例。
class A implements Fancy {
void my() {
Fancy b = // new X(); where X could be A or B
}
}
当你有B
时也会实现Fancy
。
答案 0 :(得分:8)
使用abstract class AbstractFancy
方法创建create
:
abstract class AbstractFancy implements Fancy {
abstract Fancy create();
void my() {
Fancy b = create();
//....
}
}
在每个类中实现create
方法:
class A extends AbstractFancy {
Fancy create() {
return new A();
}
}
class B extends AbstractFancy {
Fancy create() {
return new B();
}
}
答案 1 :(得分:3)
我假设您希望在基类中定义my()
,如FancyAdapter
,它具有不同的子类,并且您希望它创建实际具体子类的实例。如果您可以假设实现Fancy
的所有类都具有默认(无参数)构造函数:
Fancy b = (Fancy) getClass().newInstance();
答案 2 :(得分:3)
class A implements Fancy {
void my() {
Fancy b = (Fancy)getClass().newInstance();
}
}
答案 3 :(得分:2)
反思性? (不推荐)
Fancy b = this.getClass().newInstance();
如果存在基于零参数的构造函数(隐式或显式),这将起作用。确保在声明周围做try {} catch{}
。
其他方式:
class A implements Fancy, Cloneable {
void my() {
try {
Fancy b = (Fancy) clone();
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
或者,您可能希望构建器创建新的Fancy
对象。