[英]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.