对于"伪类型反模式",有没有理由?

Sim*_*son 10 java typedef anti-patterns

我有一个相对复杂的泛型类型(比如说Map<Long,Map<Integer,String>>),我在课堂内部使用它.(没有外部可见性;它只是一个实现细节.)我想在typedef中隐藏它,但Java没有这样的功能.

昨天我重新发现了以下成语,并且对于被认为是反模式感到失望.


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 */

}
Run Code Online (Sandbox Code Playgroud)

当类型被隐藏并且不构成库API的一部分时(在我看来,Goetz对使用它的主要反对意见),是否有任何理由可以解决这个问题?

Ste*_*n C 12

IMO,Java反模式的问题在于它们鼓励黑白思维.

实际上,大多数反模式都是微妙的.例如,链接文章解释了伪typedef如何导致API的类型签名过于严格,与特定的实现决策,病毒等相关联.但这完全是在公共API的背景下.如果你将伪typedef保留在公共API之外(即将它们限制为一个类,或者可能是一个模块),它们可能没有真正的危害,它们可能会使你的代码更具可读性.

我的观点是,你需要了解反模式,并对何时何地避免它们作出合理的判断.简单地采取"我永远不会做X因为它是一种反模式" 的立场意味着有时你会排除可接受的,甚至是好的解决方案.


dfa*_*dfa 5

真正的问题是这个习惯用法在你的伪typedef和你的客户端代码之间创建了一个高度耦合.但是,由于您FooBarMap私下使用,因此没有真正的耦合问题(它们是实现细节).

NB

现代Java IDE应该有助于处理复杂的泛型类型.

  • 如果你不使用这个习惯用法,那么你就会在长而复杂的类型描述(`HashMap&lt;Long,Map&lt;Integer,String&gt;&gt;`)和客户端代码之间产生高度耦合。你能解释为什么反模式的耦合比​​这更糟糕吗? (2认同)