【发布时间】:2018-11-08 09:24:43
【问题描述】:
我目前正在为我的 Java 项目开发协议处理程序。我正在尝试创建一个可维护和可扩展的 API,这意味着我不想简单地硬编码支持的值类型。
我已经开始设计一个“协议处理程序”,它给定一个(受支持类型的)值,可以根据协议规范对该值进行编码,而客户无需担心翻译过程的细节。
不同的值类型,例如字符串或整数必然有不同的编码过程,但我不希望客户担心他们可能需要编码的每种可能类型持有对不同对象的引用——正如我所说,我不希望他们担心细节。
到目前为止,我已经定义了一个“通用”DynamicHandler 类,它维护着一个“特定”类型感知的 StaticHandlers 集合:
class DynamicHandler
{
Map<Class, StaticHandler> handlers;
<T> void handle(T value)
{
if(handlers.containsKey(value.class))
handlers.get(value.getType()).handle(value);
}
void <T> register(StaticHandler<T> handler)
{
handlers.put(T.class, handler);
}
}
这个类的想法是,客户端只需将他们想要编码的值传递给 handle 方法,然后 DynamicHandler 查找并委托给 StaticHandler。
interface StaticHandler<T>
{
void handle(T value);
}
这里是一些使用这个系统的客户端的例子:
class StringHandler implements StaticHandler<String>
{
void handle(String value)
{
...
}
}
DynamicHandler handler = new DynamicHandler();
handler.register(new StringHandler());
handler.handle("Hello World!");
我有两个问题正在努力寻找自己的答案:
- 在
DynamicHandler.register方法中,如何在没有T实例的情况下获取T的类型? - 是否可以将 DynamicHandler 类型实现为 java.util.Map,以最大限度地与任何 3rd 方代码客户端兼容,可用于构建或以其他方式处理此类对象?
编辑:由于 DynamicHandler 本质上是一个 Map,尽管有一些通用的技巧,是否可以将其实现为:DynamicHandler implements java.util.Map<...,...>(我不确定 Key 和 Value 类型应该在这里)。
这是我第一次在这里提出问题,所以我希望我已经对大家足够清楚了。如果您认为有什么需要澄清的,请告诉我,我会尽力而为。
【问题讨论】:
-
您能否尝试更清楚地说明您的第二个问题?我很难弄清楚你到底在问什么。
-
您可以在
DynamicHandler.handle()中传入的对象上调用getClass(),而不是使用无法编译的obj.class。您假设如果传入null,则应该没有任何需要处理的内容,并且对象不会与映射中的多个键匹配。 -
@Jal 抱歉,这实际上只是我的代码中的一个错误。我将其更新为使用 getClass() 。我也澄清了我的第一个问题,明确我想知道如何在 register 方法中获取 T 的类型。
-
@Ohlec 我已经编辑了我的第二个问题,希望现在更清楚了。
-
@MattMead 您如何想象客户将其用作地图?
handle()不是已经是最方便的界面了吗?
标签: java dictionary generics