でコレクションクラスをカプセル化するには、私は次のタイプのデータがあるとします。継承および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
}
今私は、顧客のそれぞれが、各サービスに接続したときに覚えておく必要があります。
私は構造になるだろう:
Map<Customer, Map<Service, LastConnection>> lastConnections;
をあるいは、IDSで検索できるようにしていないすべての均等を記述する必要が()とhashCode():
はMap<String, Map<String, LastConnection>> lastConnections;
今、私はアクセスすることができました
LastConnection connection = lastConnections.get(custId).get(srvUrl);
すべてこれは私がLastConnections、Sのマップのマップを期待する方法の数十にパラメータとして渡す必要があり、特にこと、醜いと思われることでLastConnectionデータO私はそのようなことになり、私自身のクラスの作成を考えています:
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;
}
問題があることである:
class CustomerConnections extends HashMap<String, LastConnection> {
}
class AllConnections extends HashMap<String, CustomerConnections> {
public LastConnection get(String custId, String srvUrl) {
return get(custId).get(srvUrl);
}
}
[OK]を、私はその継承が3v1lで、それでは、構図を試してみましょうすでに学びました私は、SOLIDの原則とすべてのベストプラクティスを尊重した最善のアプローチが何であるかはわかりません。既存のコレクションを拡張する以外は何もしないクラスを作成することは、必要以上にエンティティを増やすように思えますが、コードをより明確にします(特に、月ごとにAllConnectionsのマップなどの次のレベルがある場合)。どんな方向?あなたはがMap<K,V>
を実装するクラスを作成し、内部の容器マップに委任することができ
無益な「その他すべての必要な操作」コメントは、定型的な代表団の計量値を隠しています。 –
@マイケル・フェア・ポイント – butterchicken
これは一度だけ行う必要があります。 DelegatingMapは、マップを実装しており、すべてのそのような拡張の基本クラスとして使用できます。 –
paulcm