每个接口实现的唯一标识符

时间:2012-01-27 14:32:08

标签: java interface

我有一个名为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);

对此有何想法?

2 个答案:

答案 0 :(得分:2)

如果你知道每个实现类最多只有一个实例,那么使用Class对象作为键是一个非常自然的解决方案。

如果不这样做,那么ID显然必须是特定于实例的,而不是特定于类的。

答案 1 :(得分:0)

如何为所有可能的服务器类型和界面定义枚举ServerIdentifier

ServerIdentifier getServerIdentifier();

您的地图可能是Map<ServerIdentifier, List<AbstractServer>>,您甚至可以管理一个服务器类型的多个实例......

使用Class-Object作为键的优势只是处理服务器类型的一种更自然的方式,因为你可以使用枚举而不必比较类对象......