我有一个名为AbstractServer
的包私有界面,它提供了三种方法:start()
,stop()
和init()
。
对于每个新服务器,我实现接口并覆盖这些方法。之后,我将这个新服务器注册到我的公共ServerManager
- 类,它收集HashMap
中的所有服务器并按特定顺序调用它们的公开方法。
因此,从代码中的其他位置启动所有已注册的服务器只是这样:
ServerManager.INSTANCE.startServers();
我目前面临的问题是,我希望能够从ServerManager
地图中删除服务器。
我的想法是在界面中引入public static final String IDENTIFIER
字段,并将其用作HashMap
中的键。这样,要从ServerManager
中删除服务器,我会写:
ServerManager.INSTANCE.removeServer(HttpServer.IDENTIFIER);
问题是,我在界面中没有“抽象”属性,因此无法强制实现覆盖它。
我也不能使用普通方法(非静态),因为Server-implementation的构造函数将是package-private。
作为替代方案,我考虑使用Class
实现作为HashMap
中的键,所以我可以这样写:
ServerManager.INSTANCE.removeServer(HttpServer.class);
对此有何想法?
答案 0 :(得分:2)
如果你知道每个实现类最多只有一个实例,那么使用Class
对象作为键是一个非常自然的解决方案。
如果不这样做,那么ID显然必须是特定于实例的,而不是特定于类的。
答案 1 :(得分:0)
如何为所有可能的服务器类型和界面定义枚举ServerIdentifier
:
ServerIdentifier getServerIdentifier();
您的地图可能是Map<ServerIdentifier, List<AbstractServer>>
,您甚至可以管理一个服务器类型的多个实例......
使用Class-Object作为键的优势只是处理服务器类型的一种更自然的方式,因为你可以使用枚举而不必比较类对象......