Java中的动态绑定

时间:2010-06-04 04:38:09

标签: java php oop

我习惯用这种方式在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完成的。

2 个答案:

答案 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。如果您不想或不想这样做,可以设置一些带有反射的东西,根据模型类的名称动态选择零件类,但这听起来确实不必要地复杂化。那时你肯定会更好地选择工厂模式。