Anda tidak dapat melakukan ini secara langsung dalam satu kelas karena definisi kelas di bawah ini tidak dapat dikompilasi karena penghapusan tipe generik dan deklarasi antarmuka duplikat.
class TwoTypesConsumer implements Consumer<Apple>, Consumer<Tomato> {
// cannot compile
...
}
Solusi lain untuk mengemas operasi konsumsi yang sama dalam satu kelas mengharuskan untuk mendefinisikan kelas Anda sebagai:
class TwoTypesConsumer { ... }
yang tidak ada gunanya karena Anda perlu mengulang / menduplikasi definisi dari kedua operasi dan mereka tidak akan dirujuk dari antarmuka. IMHO melakukan ini adalah duplikasi kecil dan kode yang buruk yang saya coba hindari.
Ini mungkin menjadi indikator juga bahwa ada terlalu banyak tanggung jawab dalam satu kelas untuk mengkonsumsi 2 objek yang berbeda (jika tidak digabungkan).
Namun apa yang saya lakukan dan apa yang dapat Anda lakukan adalah menambahkan objek pabrik eksplisit untuk membuat konsumen yang terhubung dengan cara berikut:
interface ConsumerFactory {
Consumer<Apple> createAppleConsumer();
Consumer<Tomato> createTomatoConsumer();
}
Jika pada kenyataannya tipe-tipe tersebut benar-benar digabungkan (terkait) maka saya akan merekomendasikan untuk membuat implementasi dengan cara seperti ini:
class TwoTypesConsumerFactory {
// shared objects goes here
private class TomatoConsumer implements Consumer<Tomato> {
public void consume(Tomato tomato) {
// you can access shared objects here
}
}
private class AppleConsumer implements Consumer<Apple> {
public void consume(Apple apple) {
// you can access shared objects here
}
}
// It is really important to return generic Consumer<Apple> here
// instead of AppleConsumer. The classes should be rather private.
public Consumer<Apple> createAppleConsumer() {
return new AppleConsumer();
}
// ...and the same here
public Consumer<Tomato> createTomatoConsumer() {
return new TomatoConsumer();
}
}
Keuntungannya adalah kelas pabrik mengetahui kedua implementasi, ada status bersama (jika diperlukan) dan Anda dapat mengembalikan lebih banyak konsumen yang digabungkan jika diperlukan. Tidak ada pernyataan metode konsumsi berulang yang tidak berasal dari antarmuka.
Harap dicatat bahwa setiap konsumen mungkin kelas independen (masih pribadi) jika mereka tidak sepenuhnya terkait.
Kelemahan dari solusi itu adalah kompleksitas kelas yang lebih tinggi (bahkan jika ini bisa menjadi file satu java) dan untuk mengakses metode konsumsi Anda memerlukan satu panggilan lagi jadi alih-alih:
twoTypesConsumer.consume(apple)
twoTypesConsumer.consume(tomato)
kamu punya:
twoTypesConsumerFactory.createAppleConsumer().consume(apple);
twoTypesConsumerFactory.createTomatoConsumer().consume(tomato);
Untuk meringkas, Anda dapat mendefinisikan 2 konsumen umum dalam satu kelas tingkat atas menggunakan 2 kelas batin tetapi dalam kasus panggilan Anda harus mendapatkan pertama referensi ke konsumen pelaksana yang tepat karena ini tidak bisa hanya satu objek konsumen.