Memiliki rangkaian operasi "contoh" dianggap sebagai "bau kode". Jawaban standarnya adalah "gunakan polimorfisme". Bagaimana saya melakukannya dalam kasus ini?
Ada sejumlah subclass dari kelas dasar; tidak satupun dari mereka di bawah kendali saya. Situasi serupa adalah dengan kelas Java Integer, Double, BigDecimal dll.
if (obj instanceof Integer) {NumberStuff.handle((Integer)obj);}
else if (obj instanceof BigDecimal) {BigDecimalStuff.handle((BigDecimal)obj);}
else if (obj instanceof Double) {DoubleStuff.handle((Double)obj);}
Saya memiliki kendali atas NumberStuff dan seterusnya.
Saya tidak ingin menggunakan banyak baris kode di mana beberapa baris bisa digunakan. (Terkadang saya membuat pemetaan HashMap Integer.class ke instance IntegerStuff, BigDecimal.class ke instance BigDecimalStuff, dll. Tapi hari ini saya menginginkan sesuatu yang lebih sederhana.)
Saya ingin sesuatu yang sederhana seperti ini:
public static handle(Integer num) { ... }
public static handle(BigDecimal num) { ... }
Tapi Java tidak berfungsi seperti itu.
Saya ingin menggunakan metode statis saat memformat. Hal-hal yang saya format adalah gabungan, di mana Thing1 dapat berisi array Thing2s dan Thing2 dapat berisi array Thing1s. Saya mengalami masalah ketika saya menerapkan format saya seperti ini:
class Thing1Formatter {
private static Thing2Formatter thing2Formatter = new Thing2Formatter();
public format(Thing thing) {
thing2Formatter.format(thing.innerThing2);
}
}
class Thing2Formatter {
private static Thing1Formatter thing1Formatter = new Thing1Formatter();
public format(Thing2 thing) {
thing1Formatter.format(thing.innerThing1);
}
}
Ya, saya tahu HashMap dan sedikit lebih banyak kode dapat memperbaikinya juga. Tapi "contoh" tampaknya begitu mudah dibaca dan dipelihara sebagai perbandingan. Adakah yang sederhana tapi tidak berbau?
Catatan ditambahkan pada 5/10/2010:
Ternyata subclass baru mungkin akan ditambahkan di masa mendatang, dan kode saya yang ada harus menanganinya dengan baik. HashMap di Kelas tidak akan berfungsi dalam kasus itu karena Kelas tidak akan ditemukan. Rantai pernyataan if, dimulai dengan yang paling spesifik dan diakhiri dengan yang paling umum, mungkin adalah yang terbaik:
if (obj instanceof SubClass1) {
// Handle all the methods and properties of SubClass1
} else if (obj instanceof SubClass2) {
// Handle all the methods and properties of SubClass2
} else if (obj instanceof Interface3) {
// Unknown class but it implements Interface3
// so handle those methods and properties
} else if (obj instanceof Interface4) {
// likewise. May want to also handle case of
// object that implements both interfaces.
} else {
// New (unknown) subclass; do what I can with the base class
}
[text](link)
untuk memposting link di komentar.