在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中声明别名的可接受的(可能是有创意的)方式吗?
发布于 2010-03-10 17:19:25
缺点是您不能直接使用任何返回正确类型的Map
的方法,因为它们永远不会返回MyMap
。即使他们可以返回一个Map<SomeSuperLongIdentifier, OtherSuperLongIdentifier>
。
例如,您不能使用Maps
(由Google Collections提供)中的filter()
方法。它们将接受一个MyMap
实例作为输入,但它们只返回一个Map<SomeSuperLongIdentifier, OtherSuperLongIdentifier>
。
通过编写委托给另一个Map
实现的MyMap
,可以在一定程度上减少这个问题。然后,您可以将这样的方法的返回值传递到构造函数中,并且仍然有一个MyMap
(甚至不需要复制)。默认构造函数可以将委托设置为新的HashMap
实例,因此默认用法将保持不变。
发布于 2010-03-10 16:50:29
我认为这肯定是一种声明类型同义词的方便方法。一些语言对此有直接支持(例如,在Delphi (pascal)中,您可以这样做:
type MyMap = HashMap<SomeSuperLongIdentifier, OtherSuperLongIdentifier>;
既然Java不这样做,我想你可以使用继承。您需要记录该声明只是一个同义词,没有人应该将meethods添加到这个类中。另请注意,这会消耗少量内存用于VMT存储。
发布于 2010-03-10 16:51:25
我反对使用MyMap
这个名称:既然您创建了一个别名,那么就给它一个有用的名称来说明它的用途。除此之外,我喜欢它。
https://stackoverflow.com/questions/2415468
复制相似问题