繁体   English   中英

Java中的动态绑定

[英]Dynamic Binding in Java

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

一种选择是创建一个工厂 ,每个类都可以向其注册,然后可以调用该工厂来创建适当的对象。

反射是处理此问题的一种方法,或者至少可以做与您在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 )。 如果您不希望或不能做到这一点,则可以使用反射进行设置,以根据模型类的名称动态选择零件类,但这听起来确实不必要。 到那时,您绝对最好采用工厂模式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM