代码之家  ›  专栏  ›  技术社区  ›  Yuval Adam

是否可以将私有类声明为别名?

  •  14
  • Yuval Adam  · 技术社区  · 14 年前

    my answer from yesterday 我把下面的代码称为“黑客”。

    final class MyMap extends HashMap<SomeSuperLongIdentifier, OtherSuperLongIdentifier> {}
    // declared MyMap as an alias for readability purposes only
    
    MyMap a = new MyMap();
    a.put("key", "val");
    

    再考虑一下,这看起来一点也不坏,但我可能遗漏了一些东西。有没有我漏掉的坑?在Java中声明别名是一种可接受的(可能是创造性的)方式吗?

    10 回复  |  直到 14 年前
        1
  •  5
  •   Joachim Sauer    14 年前

    缺点是您不能直接使用返回正确类型的 Map ,因为他们永远不会返回 MyMap . 即使他们可以返回 Map<SomeSuperLongIdentifier, OtherSuperLongIdentifier> .

    例如,您将无法使用 filter() 方法在 Maps (由 Google Collections )他们会 接受 我的地图 实例作为输入,但它们会 返回 只有一个 地图<somesuperlongdentifier,othersuperlongdentifier> .

    这个问题可以通过写下 我的地图 委托他人 地图 实施。然后可以将此类方法的返回值传递到构造函数中,并且 我的地图 (甚至不复制)。默认构造函数只能将委托设置为新的 HashMap 实例,因此默认用法将保持不变。

        2
  •  3
  •   Aaron Digulla    14 年前

    我反对这个名字 MyMap :因为您创建了一个别名,所以要通过给它一个有用的名称来记录它的用途。除此之外,我喜欢。

        3
  •  3
  •   Vladislav Rastrusny    14 年前

    我认为这肯定是声明类型同义词的一种方便方法。有些语言对此有直接支持(例如,在Delphi(Pascal)中,您可以这样做:

    type MyMap =  HashMap<SomeSuperLongIdentifier, OtherSuperLongIdentifier>;
    

    由于Java没有,我认为您可以使用继承。你需要证明,这个声明只是一个同义词,没有人应该向这个类添加meethods。还要注意,这会为vmt存储消耗一点内存。

        4
  •  2
  •   Sean Owen    14 年前

    我个人不会这样做,会在评论中加以标记,但这是一个意见问题。

    Google Collections通过允许您声明以下内容,帮助缓解此问题:

    Map<SomeSuperLongIdentifier, OtherSuperLongIdentifier> a = Maps.newHashMap();
    

    我将寻找重构代码的方法,也许不必声明这个映射的如此多实例。

        5
  •  2
  •   alex.zherdev    14 年前

    只要使用代码的开发人员具有IDE,并且能够快速跳转到类定义并为其目的阅读注释(这些注释在适当的位置,不是吗?)我看不出有什么问题。

        6
  •  2
  •   user207421    14 年前

    我不会叫它“别名”。它不是。它不能与它应该是别名的类型互换使用。所以如果这就是目的,它就失败了。

        7
  •  1
  •   David Soroko    14 年前

    我认为与手头的问题相比,继承权是一把很大的枪。至少我会做这个“别名类” 最终的 以一个大的肥大的评论描述它存在的原因。

        8
  •  1
  •   Riduidel    14 年前

    好吧,这里有两个矛盾的方面。

    1. 从建模的角度来看,您的声明是 正确的 因为它强调类提供的封装。
    2. 从编码的角度来看,您的声明可以被视为 错误的 因为您只添加一个类作为建模支持,而绝对没有添加任何特性。

    但是,我发现您的方法是非常正确的(尽管我以前从未考虑过),因为它提供了一个非常受欢迎(至少对我来说是这样)的可编译模型:您的模型中的类完全反映在您的代码中,使您的规范可执行,这是非常酷的。

    所有这些让我觉得这绝对是一个好主意,只要你用文档来支持它。

        9
  •  0
  •   Tim Bender    14 年前

    我不会称之为黑客。就我个人而言,我创建了一个别名,用于声明不能更改的泛型类型参数,并创建了一些清晰性。

        10
  •  0
  •   james    14 年前

    如果发送到另一个没有mymap类的jvm,也无法在序列化中使用此映射。