Java 访问者模式同时适用于原始类型和类

标签 java

我正在努力减少一个项目所需的方法数量,因此我希望找到一种根据输入参数的类型/类动态采取操作的方法,而不是这么多重载。 我有原始类型(long、double)和类(字符串、数组或自定义类)的参数。

我有这个方法,应该可供所有人使用 - 它也是重载的。

public void write(long n){
    //Some operations
}

public void write(String str){
    //Some other operations
}

我尝试使用 Java 泛型类型,但它不起作用 - 就像这样

public <T> void mainMethod(T... inputs){
    for (T input: inputs){
        write(input);
    }    
}

这会给我错误无法解析方法“write(T)”。 我想我可以使用一堆instanceof和其他转换操作,但我只是想知道是否还有其他方法?

提前致谢!

最佳答案

假设所有对象和类型都有不同的write需要不同的处理,我可以想到五种方法。

不好:更改 mainMethod 以包含大量 instanceof 检查。这不会减少 write() 的重载方法计数。一些 IDE 会发出警告,指出这还不够“面向对象”。

不好:让 write() 接受 Object 并将 if 链放在那里。同样的 IDE 警告。

否:您可以将 write 的功能从实用程序类中取出,并将其放入要传递给 write 的每个对象的子类中。由于原语的原因,这是不可能的。您可以扩展 Number,但这很麻烦。

否:对于每个对象T input,您可以根据参数类型反射性地获取正确的方法,然后调用该方法。仍然没有回答您如何减少重载次数的问题。

最好:尝试找到您想要使用所有这些完全不同的参数执行的操作的共同点。在 write 的情况下,它可能是转换为 String 或某种形式的序列化或转换。在每种情况下,您都可以做两件事。

  • “预处理”对象(例如 String.valueOf().toString() 或您自己的方法)以获得一个或少量,类型,因此您不需要那么多方法。 (就像使用 System.out.println 所做的那样)
  • 为所有非原始类创建一个接口(interface),表明您的 write 函数可以接受它们(就像使用 Serialized 所做的那样)。此接口(interface)应该公开一些方法,这些方法可以使用 write 来消除对 if 链的需要。
<小时/>

至于为什么instanceof链不好,我引用IntelliJ的警告:

Reports any chains of if-else statements all of whose conditions are instanceof expressions or class equality expressions (e.g. comparison with String.class). Such constructions usually indicate a failure of object-oriented design, which dictates that such type-based dispatch should be done via polymorphic method calls rather than explicit chains of type tests.

关于Java 访问者模式同时适用于原始类型和类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50700573/

相关文章:

java - PostgreSQL 序列的 increment_by 如何与 Hibernate 的 allocationSize 一起工作?

java - 使用反射设置值时遇到的问题

java - Weblogic,带有 ejb3 的 Tibco SSL :javax. jms.JMSSecurityException:无法连接到任何服务器

java - 线程池中实际创建线程

java - 无法使用 EasyMock 覆盖 org.openide.nodes.Node 方法调用的函数

java - 如何在 RxJava 中创建可观察对象和观察者?

java - 仅将时间存储在时间变量中,不包含 01.01.1970 的数据

java - Java : Variable is already defined in method main

java - 如何验证调用了非模拟对象的方法?

java - 为什么 org.eclipse.egit.github.core API 上的字段 "language"返回 null 到所有存储库?