Java: передача имени класса в функцию - PullRequest
0 голосов
/ 18 октября 2018

У меня три очень похожие функции и я хочу провести рефакторинг.Однако функции используют функцию из класса, поэтому мне интересно, есть ли способ передать имя класса / класса в функцию?

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 голосов
/ 19 октября 2018

Вы можете попробовать использовать 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, вы можете узнать больше об этом в документации .Просто он определяет функцию, которая принимает один агрегат типа T и возвращает значение типа R.

И странный вид :: - это справочник по методам

0 голосов
/ 18 октября 2018

Можно заставить 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...