Java方法重载和调用

斑点

假设我有一个带有一个参数的方法,并且根据参数的类型,该方法应该做不同的事情。

让我们称之为方法doMethod()

private int doMethod(Class1 x) {
    // do something with x
}

private int doMethod(Class2 x) {
   // do someting else with x
}

...

我有几种这样的方法。现在出现了我的问题:我有一个不同的方法,该方法接受一个参数,该参数是上面所有其他类的超类(但实际上,它始终是其子类之一):

private void otherMethod(SuperClass obj) {
      // I do something clever with obj, 
      // which is the super class of Class1, Class2, .. Classn
      // however this method is always called with either Class1, Class2, etc.
      // never with an instance of SuperClass itself.

      // finally I want to execute doMethod() on obj:
      int result = doMethod(obj);        

      // fails because doMethod(SuperClass) does not exist
}

所以最后我最终创建了一个doMethod(Superclass obj),使用来检查obj,instanceof然后doMethod()使用强制转换进行调用

必须有更好的方法来做到这一点吗?我暂时还没想到,所以也许有人可以帮我一下:)

非常感谢!

保罗

几种可能性:

子类+访问者模式

您可以为每个子类创建一个子类(如果不是最终的)。您可以让他们提供一种visit()方法,并doMethod()使用Visitor模式实施您的附加操作这将为以后增加其他操作提供可能性。如果正确完成了Visitor模式,则应该不会忘记将操作添加到新的子类中(因为它不会编译)。根据您的需要,这可能不是好事,而是好事。

子子类是有关此解决方案的部分,我喜欢。这里有爆炸类层次结构和复杂性的危险:如果可能的话,我会让您添加的额外子类最终化。您还要麻烦的是,您扩展的任何类都将在将来成为最终类(向后兼容中断,但并非不可能)。

此处的示例:http : //www.javacodegeeks.com/2013/08/visitor-design-pattern-in-java-example-tutorial.html(在本示例中,开发人员可以访问基类并在其中添加visit()方法,而您必须将其添加到由您的额外子类实现的通用接口中)。

汇总+访客模式

上面的一种变体是创建一个并行的类层次结构,其中您自己的类包含(而不是子类)另一个层次结构中的类的实例。您将添加visit()到自己的类层次结构(以及所需的任何其他方法)中,并且还提供了一种访问基础类型的方法。您应该能够很好地将其包装在泛型中。

同样,这里可能存在很多复杂性。

“处理程序”的地图

您可以在实例类型为键的映射中查找作为接口实现的操作。

// Java-y pseudo-code...
Map<Class<? extends SuperClass>,Function<V,R>> doMethods = new HashMap<>();
doMethods.add(FooClass.class, FooDoMethod.INSTANCE);
doMethods.add(BarClass.class, BarDoMethod.INSTANCE);
...
public R doMethod(V it) {
    Class<? extends V> cls = it.getClass();
    Function<? extends V,R> fn = doMethods.get(cls);
    if(fn==null)
        throw new UnsupportedOperationException(
            "Can't doMethod() on a "+cls.getName());
    return fn.apply(it);
}

INSTANCE这里单例对象将实现类似于FunctionJava 1.8(或1.8之前的Comparable)中的新接口的功能,即使用具有实现该操作的单个方法的接口实现。然后,您可以通过向映射添加更多条目来扩展支持该操作的类型。您需要为每种受支持的类型添加一个显式条目(即使中间基础类实际上可以有实例,也可以在Swing中类似于JComponent和JButton(两者都可以存在一个真实的实例)。如果要以相同的方式实现多个类型,请为多个类型添加相同的实现。

然后,您可以在其他一些类中隐藏对映射的处理程序(以及映射本身)的调度。

(PS抱歉,手头没有Javac,否则我会适当地尝试这些方法。)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章