小编Jak*_*kub的帖子

在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
}
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)

java collections inheritance encapsulation

5
推荐指数
1
解决办法
2365
查看次数

接口使用摘要作为参数声明方法

关于以下示例中的最佳做法,我有这个问题:

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下运行的代码中使用它们?)

java interface

0
推荐指数
1
解决办法
202
查看次数