"Eşgörünüm" işlemleri zincirine sahip olmak "kod kokusu" olarak kabul edilir. Standart cevap "polimorfizm kullan" dır. Bu durumda bunu nasıl yaparım?
Bir temel sınıfın birkaç alt sınıfı vardır; hiçbiri benim kontrolüm altında değil. Integer, Double, BigDecimal vb Java sınıflarında da benzer bir durum söz konusudur.
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);}
NumberStuff üzerinde kontrole sahibim ve benzeri.
Birkaç satırın işe yarayacağı çok sayıda kod satırı kullanmak istemiyorum. (Bazen bir IntegerStuff örneğine Integer.class, BigDecimalStuff örneğine BigDecimal.class gibi bir HashMap eşlemesi yaparım. Ama bugün daha basit bir şey istiyorum.)
Bunun kadar basit bir şey istiyorum:
public static handle(Integer num) { ... }
public static handle(BigDecimal num) { ... }
Ancak Java bu şekilde çalışmıyor.
Biçimlendirirken statik yöntemler kullanmak istiyorum. Biçimlendirdiğim şeyler bileşik, burada bir Thing1 bir Thing2s dizisi içerebilir ve bir Thing2 bir Thing1 dizisi içerebilir. Biçimlendiricilerimi şu şekilde uygularken bir sorun yaşadım:
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);
}
}
Evet, HashMap'in ve biraz daha fazla kodun da bunu düzeltebileceğini biliyorum. Ancak "instanceof", kıyaslandığında çok okunabilir ve sürdürülebilir görünüyor. Basit ama kokmayan bir şey var mı?
Not 5/10/2010 eklendi:
Görünüşe göre gelecekte yeni alt sınıflar eklenecek ve mevcut kodumun bunları zarif bir şekilde ele alması gerekecek. Sınıfta HashMap bu durumda çalışmayacaktır çünkü Sınıf bulunmayacaktır. En özelden başlayıp en genel olanla biten if ifadelerinden oluşan bir zincir, sonuçta muhtemelen en iyisidir:
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
}