Java:将类名传递给函数

时间:2018-10-18 13:45:43

标签: java function class refactoring

我有三个非常相似的功能,想重构。但是,这些函数使用的是类中的函数,因此,我想知道是否存在将类/类名传递给函数的方法吗?

new GenericClass1 = genericClass1;
new GenericClass2 = genericClass2;
new GenericClass3 = genericClass3;

public ReturnsClass1 myFunction1 (){
    return genericClass1.functionFromClass(paramter);
}
public ReturnsClass2 myFunction2 (){
    return genericClass2.functionFromClass(paramter);
}
public ReturnsClass3 myFunction3 (){
    return genericClass3.functionFromClass(paramter);
}

为说明起见,我想要这样的东西:

public ReturnsClass myFunction (classInstance) {
    return classInstance.functionFromClass(parameter);
}

2 个答案:

答案 0 :(得分:1)

您可以使GenericClass*实现一个通用的通用接口,该方法在其中返回通用类型参数的实例。

interface GenericInterface<T> {
    T functionName(Object parameter); //change parameter type
}

然后可以将其扩展为GenericClass*

class GenericClass1 implements GenericInterface<ReturnsClass1> {
    public ReturnsClass1 functionName(Object parameter) {
        ...
    }
}

以相同的方式,GenericClass2将实现GenericInterface<ReturnsClass2>,而GenericClass3将实现GenericInterface<ReturnsClass3>

您的方法将如下所示:

public <T> T myFunction (GenericInterface<T> classInstance) {
    return classInstance.functionName(parameter);
}

答案 1 :(得分:1)

您可以尝试使用java.util.function.Function<T, R>

它可能看起来像这样:

public <R> R myFunction (Function<Object, R> func) {
    return func.apply(parameter);
}

用法:

ReturnClass1 rc1 = myFunction(genericClass1::functionFromClass);
ReturnClass2 rc2 = myFunction(genericClass2::functionFromClass);

此方法的优点是您不需要通用类来共享接口,并且所有重构都进入myFunction中。该接口是Java 8中引入的功能接口,您可以阅读有关它的更多信息in the docs。它的作用很简单,它定义了一个函数,该函数接受类型为T的单个集合,并返回类型为R的值。

看上去很::的是method reference