我习惯用这种方式在PHP中进行动态绑定
function ($className)
{
$obj = new $className();
.
.
.
}
这里$ className是一个String参数,根据类的名称创建该类的对象。因此,当我需要添加更多功能时,我只需添加另一个类,所有内容都会自动排序。
现在我想在Java中做类似的事情。现在我的代码是
public EditPart createEditPart(EditPart context, Object model) {
AbstractGraphicalEditPart part = null;
if(model instanceof Entreprise) {
part = new EntreprisePart();
else if(model instanceof Employee)
part = new EmployeePart();
.
.
.
}
我的目标是,如果我在包中添加一个新类,我不需要修改我的createEditPart函数。 它是如何用Java完成的。
答案 0 :(得分:4)
一个选项是创建一个factory,每个类都可以自己注册,然后可以调用它来创建适当的对象。
答案 1 :(得分:1)
处理这个问题的一种方法,或者至少是你在PHP中讨论的相同的事情,就是反思。您可以从指定完全限定类名的字符串中获取Class
对象,并使用该类动态创建自身的新实例。
public EditPart createEditPart(String name) throws [lots of stuff] {
return Class.forName(name).asSubclass(EditPart.class).newInstance();
}
但是,这是一种使用Java的效率相对较低的方法,我不一定会推荐它。其他一些语言使用反射非常自由(如PHP),但与Java不同。 Amber的工厂理念很好,如果我这样做的话,我可能会这样做。
如果要根据EditPart
对象的类(如代码示例中)创建model
,而不是基于EditPart
子类的名称,那么您不能用反射。好吧,你可以,但是你仍然需要一些方法来告诉程序哪个EditPart
对应于哪种类型的模型。一种选择是将model
参数的类型从Object
更改为某个接口,比如说EditModel
,您可以编写该接口以获得返回相应部分实例的方法。像这样:
public interface EditModel {
public EditPart getEditPart();
}
然后您可以将createEditPart
写为
public EditPart createEditPart(EditModel model) {
return model.getEditPart();
}
(实际上,如果它很简单,你可能根本不需要createEditPart
。如果您不想或不想这样做,可以设置一些带有反射的东西,根据模型类的名称动态选择零件类,但这听起来确实不必要地复杂化。那时你肯定会更好地选择工厂模式。