我有一个相对复杂的泛型类型(例如Map<Long,Map<Integer,String>>
),我在类内部使用它。 (没有外部可见性;它只是实现细节。)我想将其隐藏在typedef中,但是Java没有这种功能。
昨天,我重新发现了以下成语,并对得知它是considered an anti-pattern 感到失望。
class MyClass
{
/* "Pseudo typedef" */
private static class FooBarMap extends HashMap<Long,Map<Integer,String>> { };
FooBarMap[] maps;
public FooBarMap getMapForType(int type)
{
// Actual code might be more complicated than this
return maps[type];
}
public String getDescription(int type, long fooId, int barId)
{
FooBarMap map = getMapForType(type);
return map.get(fooId).get(barId);
}
/* rest of code */
}
当类型被隐藏并且不构成库API的一部分时(在我的阅读中,这是Goetz对其使用的主要反对意见),对此是否有任何理由?
最佳答案
真正的问题是,这个惯用法在伪typedef和客户端代码之间建立了高度的耦合。但是,因为您是私下使用FooBarMap
,所以耦合并没有真正的问题(它们是实现细节)。
NB
现代的Java IDE绝对可以帮助处理复杂的泛型类型。