我正在努力减少一个项目所需的方法数量,因此我希望找到一种根据输入参数的类型/类动态采取操作的方法,而不是这么多重载。 我有原始类型(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/