Общий метод, который принимает уникальный параметр и возвращает уникальные параметры Java

У меня есть требование, когда функция принимает разные параметры и возвращает уникальные объекты. Все эти функции выполняют одну и ту же операцию.

ie.

public returnObject1 myfunction( paramObject1 a, int a) {
returnObject1 = new returnObject1();
returnObject1.a = paramObject1.a;
return returnObject1;
}

public returnOject2 myfunction( paramObject2 a, int a){
 returnObject2 = new returnObject2();
 returnObject2.a = paramObject2.a;
 return returnObject2;
}

Как вы можете видеть выше, обе функции выполняют одну и ту же задачу, но принимают разные параметры в качестве входных данных и возвращают разные объекты.

Я хотел бы свести к минимуму написание разных функций, выполняющих одну и ту же задачу.

Можно ли написать для этого универсальный метод, который может подставлять параметры на основе вызова функции?

paramObject и returnObject — это, по сути, два класса с разными переменными. Они не связаны друг с другом.

Моя цель состоит в том, что я не хочу перегружать функции, поскольку функции выполняют почти ту же работу. Я хотел бы иметь одну функцию, которая может обрабатывать разные входные данные и разные выходные данные.

моя цель - сделать что-то вроде этого (если возможно):

public static < E > myfunction( T a, int a ) {
  // do work
}

Тип возвращаемого значения E и ввод T могут изменяться.


person ajroot    schedule 06.07.2017    source источник
comment
Без более конкретной информации о том, что такое paramObject1 и paramObject2, довольно сложно ответить. Если они одного типа, возможно, вам следует сохранить два общедоступных метода, переместить общий код в новый частный метод и сделать так, чтобы каждый метод вызывал этот частный метод.   -  person VGR    schedule 06.07.2017
comment
Как связаны paramObject и returnObject?   -  person Marvin    schedule 06.07.2017
comment
Вы имеете в виду, что лечение такое же, но с другим типом объекта? Если это так, и если они используют одно и то же имя метода, вы можете написать что-то вроде public T myfunction(T param, int a)   -  person Asew    schedule 06.07.2017
comment
Возможно, public Object[] myFunction(int a , Object... abstractObjectArray) также может показаться полезным   -  person ShayHaned    schedule 06.07.2017
comment
вопрос сформулирован некорректно и не дает ясности. вам нужно несколько методов (перегрузка) или только один метод, обрабатывающий по-разному в зависимости от переданного paramIObject?   -  person digidude    schedule 06.07.2017
comment
Невозможно, чтобы один метод возвращал разные вещи, не имея общего интерфейса или абстрактного класса и (вероятно) не объявляя параметр типа либо для ReturnObject, либо для ParamObject, последнее из которых вряд ли будет хорошей идеей. Именно в этот момент вы должны пересмотреть свой дизайн. У меня есть только довольно смутное представление о том, что вы на самом деле делаете, но шаблон абстрактной фабрики кажется здесь полезным. Также может быть так, что использование перегрузок, как вы уже сделали, является прекрасным решением. Трудно сказать, не зная больше.   -  person Radiodef    schedule 06.07.2017
comment
похоже, что то, что говорит @Radiodef, теперь имеет для меня смысл. Мне пришлось бы создать интерфейс или абстрактный класс, чтобы справиться с этим.   -  person ajroot    schedule 06.07.2017
comment
В яблочко. Без абстракции все три действия (new EitherType(), objOfUnrelatedType.a = objOfAnotherUnrelatedType.a;, return objOfEitherType;) любого метода являются разными действиями, поскольку одинаковый внешний вид исходного кода не учитывается.   -  person Holger    schedule 06.07.2017


Ответы (2)


Создайте interface Foo и реализуйте этот interface в классах paramObject1 и paramObject2. Теперь ваш метод должен выглядеть так:

public Foo myFunction(Foo foo, int a){
    //Rest of the code.
    return foo;
}
person Jasman Shakya    schedule 06.07.2017
comment
Я тоже думал об этом и об абстрактном базовом классе для общности. - person JGFMK; 06.07.2017
comment
Это имеет смысл, но мне было интересно, есть ли другой способ. Я хотел бы избежать создания нового интерфейса для обработки этого, поскольку у меня есть много объектов, которые постоянно меняются. - person ajroot; 06.07.2017
comment
Я думаю, ты что-то задумал. Проблема в том, что вы не можете сделать new Foo(), когда Foo является интерфейсом. Надо найти решение этому. - person Ole V.V.; 06.07.2017

вы можете использовать 3-й метод apply для удаления дубликатов кода, в этом подходе вы отделяете создание и инициализацию от метода apply. и не важно, какой тип T используется. Например:

returnObject1 myfunction(paramObject1 a, int b) {
    return apply(returnObject1::new, b, value -> {
        //uses paramObject1
        //populates returnObject1
        //for example:
        value.foo = a.bar;
    });
}

returnOject2 myfunction(paramObject2 a, int b) {
    return apply(returnOject2::new, b, value -> {
        //uses paramObject2 
        //populates returnObject2
        //for example:
        value.key = a.value;
    });
}

<T> T apply(Supplier<T> factory, int b, Consumer<T> initializer) {
    T value = factory.get();
    initializer.accept(value);
    //does work ...
    return value;
}

Примечание 2 myfunction не обязательны, вы можете удалить их из исходного кода и вызвать метод apply напрямую, например:

paramObject2 a = ...;

returnObject2  result = apply(returnOject2::new, 2, value -> {
    //for example:
    value.key = a.value;
});
person holi-java    schedule 06.07.2017
comment
Я хотел бы исключить написание двух функций. Вместо этого используйте одну функцию, которая принимает разные параметры. - person ajroot; 06.07.2017
comment
@AJRoot, возможно, apache beanutils удовлетворит ваши потребности. вы не даете достаточно информации, поэтому мой ответ тоже абстрактный... :), и обратите внимание, 2 myfunction метода выше являются необязательными, вы также можете удалить их. - person holi-java; 06.07.2017