UIComponentBase确实有public abstract Map<String, Object> getAttributes()
方法,但没有setAttributes()方法。为什么这样设计?我假设设计师想让他的地图不可修改但是为什么呢?
我的要求是清理组件的所有属性。我怎么这样做而不是打电话给每个人?我无法在属性地图上调用clear(),因为it throws a UnsupportedOperationException
答案 0 :(得分:4)
因为它不仅仅是HashMap
左右。这是一张自定义地图,其中包含the javadoc中提到的以下特定功能:
返回的实现必须支持所有标准和可选的Map方法,并且还支持以下附加要求:
Map
实现必须实现java.io.Serializable
接口。- 任何添加
null
键或值的尝试都必须抛出NullPointerException
。- 任何添加非
String
密钥的尝试都必须抛出ClassCastException
。- 如果指定为键的属性名称与此
UIComponent
的实现类的属性匹配,则以下方法将具有特殊行为:
containsKey
- 返回false
。get()
- 如果属性是可读的,则调用getter方法并返回返回的值(将原始值包装在相应的包装类中);否则抛出IllegalArgumentException
。put()
- 如果属性是可写的,则调用setter方法设置相应的值(在相应的包装类中展开原始值)。如果该属性不可写,或者尝试将基本类型的属性设置为null
,则抛出IllegalArgumentException
。remove
- 抛出IllegalArgumentException
。
特别是get()
很特别。它不“仅仅”返回与map键相关联的值,但它实际上在当前组件上调用getter方法,例如请求component.getFoo()
时component.getAttributes().get("foo")
。反过来,这些getter方法通常委托给StateHelper
。
setAttributes()
将允许覆盖并因此破坏此合同,并可能导致整个JSF组件树失败。