7

我正在为理解 ForwardingMap 的使用而摸不着头脑?什么情况下可以使用它?

4

2 回答 2

16

ForwardingXxx类为所有 JDK 和 Guava 集合提供装饰器模式实现,包括Map.

阅读更多关于Guava 的 wikiEffective Java 2nd Edition, Item 16: Favor composition over inheritance

总而言之,继承是强大的,但它是有问题的,因为它违反了封装。仅当子类和超类之间存在真正的子类型关系时才适用。即使这样,如果子类与超类在不同的包中并且超类不是为继承而设计的,继承可能会导致脆弱性。为避免这种脆弱性,请使用组合和转发而不是继承,尤其是在存在实现包装类的适当接口时。包装类不仅比子类更健壮,而且更强大。

基本上,它允许您自定义可能不可扩展的 s,而无需添加对实际实现Map的依赖。Map

于 2013-01-29T12:39:16.027 回答
4

默认 Map 类都是最终的。这意味着你不能扩展它们。当你想创建一个具有某些特殊行为的地图时,你需要编写自己的类来实现整个 Map 接口并将所有方法转发到内部 Map。

ForwardingMap 已经是一个可扩展的类,它实现了 Map 并将所有内容转发到内部映射,从而为您简化了这一过程。这意味着您可以通过扩展它来创建自己的 Map 实现。当你这样做时,你只需要实现选定的方法,而不是全部。

一个用例可能是一个地图,它会自动验证您放入其中的所有条目,或者是一个在数据库更改时自动更新数据库的地图。

于 2013-01-29T12:38:59.560 回答