我有一个相对复杂的泛型类型(例如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绝对可以帮助处理复杂的泛型类型。

09-11 03:14