Загальний метод, який приймає унікальний параметр і повертає унікальні параметри 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

ви можете використовувати 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