varsayalım ben aşağıdaki veri türleri vardır:devralma ve Java
class Customer {
String id; // unique
OtherCustData someOtherData;
}
class Service {
String url; // unique
OtherServiceData someOtherData;
}
class LastConnection {
Date date;
OtherConnData someOtherData; // like request or response
}
Şimdi zaman hizmetlerin her biri bağlı müşterilerinin her hatırlamak gerekiyor.
Ben yapısı oluşturur:
Map<Customer, Map<Service, LastConnection>> lastConnections;
Veya, kimlikleri ile arama yapabilmek için ve tüm eşit yazmak zorunda() ve hashCode():
Map<String, Map<String, LastConnection>> lastConnections;
Şimdi erişebilecek
LastConnection connection = lastConnections.get(custId).get(srvUrl);
Bütün bunlar ben LastConnections, s haritaların harita bekliyor yöntemlerinin onlarca parametre olarak geçmek zorunda özellikle de çirkin görünüyor tarafından LastConnection verileri o ben böyle bir şey olmazdı ki kendi sınıfları oluşturma düşünüyorum:
class CustomerConnections {
Map<String, LastConnection> customerConnections;
LastConnection get(String srvUrl) {
return customerConnections.get(srvUrl);
}
... // all other needed operations;
}
class AllConnections {
Map<String, CustomerConnections> allConnections;
public LastConnection get(String custId, String srvUrl) {
return get(custId).get(srvUrl);
}
public CustomerConnection get(String custId) {
return allConnections.get(custId);
}
... // all other needed operations;
}
sorun şudur:
class CustomerConnections extends HashMap<String, LastConnection> {
}
class AllConnections extends HashMap<String, CustomerConnections> {
public LastConnection get(String custId, String srvUrl) {
return get(custId).get(srvUrl);
}
}
Tamam, o miras 3v1l zaten öğrenmiş, bu yüzden kompozisyon deneyelim KATIL prensiplere ve en iyi uygulamalara saygı duyan en iyi yaklaşımın ne olacağından emin değilim. Halihazırda var olan koleksiyonları genişletme dışında hiçbir şey yapmayan sınıflar oluşturmak, varlıkları gerekliliklerin ötesinde çoğaltmak gibi görünüyor, fakat benim kodumu daha açık hale getirecektir (Özellikle de bir sonraki seviyeler olduğunda - AllConnections'ın Haritası ay ve benzeri gibi). Herhangi bir yön?
Masum küçük "hariç diğer tüm operasyonlar" yorumunun dışında, kazan delegasyonunun bir metrik yükü gizlenir. –
@Michael Fair point – butterchicken
Sadece bunu bir kez yapmanız gerekse de. Bir DelegatingMap uygular Harita tüm bu uzantıların temel sınıfı olarak kullanılabilir. –
paulcm