在处理java.lang.Object的实例时避免使用instanceof

时间:2013-05-16 08:31:41

标签: java object instanceof

我确实在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类型,我不知道如何绕过那些实例检查?

1 个答案:

答案 0 :(得分:5)

您的主要限制是:

  

我无法更改方法签名

有了这个约束,我认为没有办法绕过instanceof用法。你方法中的所有内容都是Object

如果您至少可以为setValue(Object newValue)添加额外的重载,则可以为DateCalendarString添加必要的重载:

public void setValue(Date newValue) {}
public void setValue(Calendar newValue) {}
public void setValue(String newValue) {}

然后,编译器将通过其签名在编译时选择正确的方法。 Java不支持multiple dispatch(根据参数类型在运行时决定调用哪个方法), 所以不可能让setValue(Object newValue)自动调度回匹配的重载。

相关问题