假设我有以下类型的数据:
class Customer {
String id; // unique
OtherCustData someOtherData;
}
class Service {
String url; // unique
OtherServiceData someOtherData;
}
class LastConnection {
Date date;
OtherConnData someOtherData; // like request or response
}
Run Code Online (Sandbox Code Playgroud)
现在我需要记住每个客户何时连接到每个服务.
我会做结构:
Map<Customer, Map<Service, LastConnection>> lastConnections;
Run Code Online (Sandbox Code Playgroud)
或者,为了能够通过id搜索而不必编写所有的equal()和hashCode():
Map<String, Map<String, LastConnection>> lastConnections;
Run Code Online (Sandbox Code Playgroud)
现在我可以通过访问LastConnection数据了
LastConnection connection = lastConnections.get(custId).get(srvUrl);
Run Code Online (Sandbox Code Playgroud)
这一切看起来都很难看,尤其是我必须将它作为参数传递给期望LastConnections地图的数十种方法,所以我想创建自己的类看起来像这样:
class CustomerConnections extends HashMap<String, LastConnection> {
}
class AllConnections extends HashMap<String, CustomerConnections> {
public LastConnection get(String custId, String srvUrl) {
return get(custId).get(srvUrl);
}
}
Run Code Online (Sandbox Code Playgroud)
好的,我已经知道继承是3v1l,所以让我们尝试组合:
class CustomerConnections {
Map<String, …Run Code Online (Sandbox Code Playgroud) 关于以下示例中的最佳做法,我有这个问题:
interface Request;
interface Service {
void process(Request request)
}
class MyService implements Service;
class YourService implements Service;
class MyRequest implements Request;
class YourRequest implements Request;
Run Code Online (Sandbox Code Playgroud)
但是如何确保MyService始终接受MyRequest并且YourService只会获得YourRequest,而不是相反?明显的答案"if-instance-of-check" MyService.process(...)看起来很丑陋并且不知何故反对SOLID原则.也许有更好的方法?
也许泛型会很好解决?(但是,如何在必须在Java 1.4下运行的代码中使用它们?)