Metode Generik Yang mengambil parameter unik dan mengembalikan parameter unik Java

Saya memiliki persyaratan di mana fungsi mengambil parameter berbeda dan mengembalikan objek unik. Semua fungsi ini menjalankan operasi yang sama.

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;
}

Seperti yang Anda lihat di atas, kedua fungsi tersebut melakukan tugas yang sama tetapi keduanya mengambil parameter berbeda sebagai masukan dan mengembalikan objek berbeda.

Saya ingin meminimalkan penulisan fungsi berbeda yang melakukan tugas yang sama.

Apakah mungkin untuk menulis metode umum untuk ini yang dapat menggantikan parameter berdasarkan panggilan ke fungsi?

paramObject dan returnObject pada dasarnya adalah dua kelas yang memiliki variabel berbeda. Mereka tidak berhubungan satu sama lain.

Tujuan saya adalah saya tidak ingin melakukan fungsi yang berlebihan karena fungsinya melakukan pekerjaan yang hampir sama. Saya ingin memiliki satu fungsi yang dapat menangani input berbeda dan output pengembalian berbeda.

tujuan saya adalah melakukan sesuatu seperti ini (jika memungkinkan):

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

Tipe pengembalian E dan input T dapat terus bervariasi.


person ajroot    schedule 06.07.2017    source sumber
comment
Tanpa informasi yang lebih spesifik tentang apa itu paramObject1 dan paramObject2, jawaban ini cukup sulit. Jika tipenya serupa, mungkin Anda harus mempertahankan kedua metode publik tersebut, memindahkan kode umum ke metode privat baru, dan meminta setiap metode memanggil metode privat tersebut.   -  person VGR    schedule 06.07.2017
comment
Bagaimana paramObject dan returnObject terhubung?   -  person Marvin    schedule 06.07.2017
comment
Maksudnya perlakuannya sama, tapi jenis bendanya berbeda? Jika ya, dan jika mereka memiliki nama metode yang sama, Anda mungkin dapat menulis sesuatu seperti public T myfunction(T param, int a)   -  person Asew    schedule 06.07.2017
comment
Mungkin public Object[] myFunction(int a , Object... abstractObjectArray) mungkin juga terdengar bermanfaat   -  person ShayHaned    schedule 06.07.2017
comment
pertanyaannya tidak diungkapkan dengan benar dan tidak memberikan kejelasan. apakah Anda ingin beberapa metode (kelebihan beban) atau hanya satu metode yang diproses secara berbeda berdasarkan paramIObject yang diteruskan?   -  person digidude    schedule 06.07.2017
comment
Tidak ada cara agar satu metode mengembalikan sesuatu yang berbeda tanpa memiliki antarmuka umum atau kelas abstrak dan (mungkin) mendeklarasikan parameter tipe pada ReturnObject atau ParamObject, yang terakhir kemungkinan besar bukan ide yang bagus di sini. Pada titik inilah Anda harus mempertimbangkan kembali desain Anda. Saya hanya memiliki gambaran yang samar-samar tentang apa yang sebenarnya Anda lakukan tetapi pola Pabrik Abstrak sepertinya berguna di sini. Mungkin juga menggunakan kelebihan beban seperti yang telah Anda lakukan adalah solusi yang sangat baik. Sulit untuk mengatakannya tanpa mengetahui lebih banyak.   -  person Radiodef    schedule 06.07.2017
comment
sepertinya apa yang dikatakan @Radiodef masuk akal bagi saya sekarang. Saya harus membuat dan antarmuka atau kelas abstrak untuk menangani ini.   -  person ajroot    schedule 06.07.2017
comment
Tepat. Tanpa abstraksi, ketiga tindakan (new EitherType(), objOfUnrelatedType.a = objOfAnotherUnrelatedType.a;, return objOfEitherType;) dari masing-masing metode adalah tindakan yang berbeda, karena memiliki tampilan kode sumber yang serupa tidak dihitung.   -  person Holger    schedule 06.07.2017


Jawaban (2)


Buat interface Foo dan implementasikan interface ini di kelas paramObject1 dan paramObject2. Sekarang metode Anda akan terlihat seperti:

public Foo myFunction(Foo foo, int a){
    //Rest of the code.
    return foo;
}
person Jasman Shakya    schedule 06.07.2017
comment
Saya juga memikirkan hal itu dan kelas dasar abstrak untuk kesamaan. - person JGFMK; 06.07.2017
comment
Ini masuk akal, tapi saya bertanya-tanya apakah ada cara lain. Saya ingin menghindari pembuatan antarmuka baru untuk menangani ini karena saya memiliki banyak objek yang terus bervariasi. - person ajroot; 06.07.2017
comment
Saya pikir Anda sedang melakukan sesuatu. Tantangannya adalah Anda tidak dapat melakukan new Foo() ketika Foo adalah sebuah antarmuka. Harus menemukan solusi untuk itu. - person Ole V.V.; 06.07.2017

Anda dapat menggunakan metode apply ke-3 untuk menghapus duplikasi kode, Anda memisahkan pembuatan & inisialisasi dari metode apply dalam pendekatan ini. dan tidak peduli jenis T mana yang digunakan. Misalnya:

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;
}

Catatan 2 myfunction bersifat opsional, Anda dapat menghapusnya dari kode sumber Anda, dan memanggil metode apply secara langsung, misalnya:

paramObject2 a = ...;

returnObject2  result = apply(returnOject2::new, 2, value -> {
    //for example:
    value.key = a.value;
});
person holi-java    schedule 06.07.2017
comment
Saya ingin menghilangkan penulisan dua fungsi. Alih-alih memiliki satu fungsi yang mengambil parameter berbeda. - person ajroot; 06.07.2017
comment
@AJRoot mungkin Apache beanutils memenuhi kebutuhan Anda. anda tidak memberikan informasi yang cukup, jadi jawaban saya juga abstrak... :), dan perhatikan, 2 myfunction metode di atas bersifat opsional, Anda juga dapat menghapusnya. - person holi-java; 06.07.2017