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

时间:2010-03-10 08:41:30

标签: java

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 个答案:

答案 0 :(得分:5)

缺点是您将无法直接使用任何返回正确类型Map的方法,因为它们永远不会返回MyMap。即使他们可以返回Map<SomeSuperLongIdentifier, OtherSuperLongIdentifier>

例如,您将无法使用Maps中的filter()方法(由Google Collections提供)。他们接受 MyMap个实例作为输入,但他们仅返回 Map<SomeSuperLongIdentifier, OtherSuperLongIdentifier>

通过将MyMap写入委托给另一个Map实施,可以稍微减少此问题。然后你可以将这样一个方法的返回值传递给构造函数,并且仍然有一个MyMap(没有复制,甚至)。默认构造函数可以将委托设置为新的HashMap实例,因此默认用法将保持不变。

答案 1 :(得分:3)

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

type MyMap =  HashMap<SomeSuperLongIdentifier, OtherSuperLongIdentifier>;

由于Java没有,我认为你可以使用继承。你需要记录,这个声明只是一个同义词,没有人应该将meethods添加到这个类。另请注意,这会占用VMT存储空间。

答案 2 :(得分:3)

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

答案 3 :(得分:2)

我个人不会这样做,并会在评论中将其标记出来,但这是一个意见问题。

Google Collections允许您声明:

,有助于缓解此问题
Map<SomeSuperLongIdentifier, OtherSuperLongIdentifier> a = Maps.newHashMap();

我想找到重构代码的方法,而不必为此Map声明这么多实例。

答案 4 :(得分:2)

只要使用您的代码的开发人员拥有IDE并且能够快速跳转到类定义并阅读注释以达到其目的(已经到位,不是吗?),我可以看到它没有任何问题。

答案 5 :(得分:2)

我不会称之为“别名”。事实并非如此。它不能与它应该是别名的类型互换使用。所以,如果这是意图,那就失败了。

答案 6 :(得分:1)

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

答案 7 :(得分:1)

嗯,这里有两个相互矛盾的方面。

  1. 从建模的角度来看,您的声明是正确,因为它强调了您的课程提供的封装。
  2. 从编码的角度来看,您的声明可能会被视为错误,因为您只将一个类添加为建模支持,绝对没有添加功能。
  3. 然而,我发现你的方法非常正确(虽然我之前从未考虑过),因为它提供了一个非常受欢迎的(好吧,至少对我来说)可编译模型:模型中的类完全反映在你的代码中,使你的规范可执行,非常酷。

    所有这一切都让我说这绝对是一个好主意,前提是你支持文档。

答案 8 :(得分:0)

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

答案 9 :(得分:0)

如果发送到另一个没有MyMap类的jvm,你也无法在序列化中使用这个地图。