Общ метод, който взема уникален параметър и връща уникални параметри 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, последното от които е много малко вероятно да бъде добра идея тук. В този момент трябва да преразгледате дизайна си. Имам само доста бегла представа какво всъщност правите, но моделът Abstract Factory изглежда може да е полезен тук. Също така може да се окаже, че използването на претоварвания, както вече сте направили, е идеално решение. Трудно е да се каже без да се знае повече.   -  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

можете да използвате третия 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