我确实在ym代码中有一些instanceof检查,但有一些我希望我能避免。通常只要有多个if语句,例如:
public void setValue(Object newValue) {
//dateTime is a member variable of the type java.util.Date
if (newValue instanceof Date) {
dateTime = new DateTime((Date) newValue);
} else if (newValue instanceof Calendar) {
dateTime = MyDateTimeUtils.toDate((Calendar)newValue);
} else if (newValue instanceof String) {
dateTime = MyDateTimeUtils.toDate((String)newValue);
}
}
MyDateTimeUtils只是一个实用工具类,可以转换日期/时间类型(日历到日期,日期到日历,字符串到日期等...)。
我的主要问题是,newValue属于实例Object(我无法更改方法签名,因为它是处理数据绑定的框架的一部分)。如果它是有形的东西,我想它会更简单,我可以让该类实现一个提供Date转换方法的接口。但由于它是Object类型,我不知道如何绕过那些实例检查?
答案 0 :(得分:5)
您的主要限制是:
我无法更改方法签名
有了这个约束,我认为没有办法绕过instanceof
用法。你方法中的所有内容都是Object
。
如果您至少可以为setValue(Object newValue)
添加额外的重载,则可以为Date
,Calendar
和String
添加必要的重载:
public void setValue(Date newValue) {}
public void setValue(Calendar newValue) {}
public void setValue(String newValue) {}
然后,编译器将通过其签名在编译时选择正确的方法。
Java不支持multiple dispatch(根据参数类型在运行时决定调用哪个方法),
所以不可能让setValue(Object newValue)
自动调度回匹配的重载。