在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中声明别名的可接受(可能是创造性的)方法吗?
答案 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)
嗯,这里有两个相互矛盾的方面。
然而,我发现你的方法非常正确(虽然我之前从未考虑过),因为它提供了一个非常受欢迎的(好吧,至少对我来说)可编译模型:模型中的类完全反映在你的代码中,使你的规范可执行,非常酷。
所有这一切都让我说这绝对是一个好主意,前提是你支持文档。
答案 8 :(得分:0)
我不会称之为黑客。就个人而言,我已经创建了一个别名,用于声明无法更改的泛型类型参数,并创建一些清晰度。
答案 9 :(得分:0)
如果发送到另一个没有MyMap类的jvm,你也无法在序列化中使用这个地图。