UIComponentBase有一个public abstract Map<String, Object> getAttributes()
方法,但没有setAttributes()方法。为什么这样设计?我假设设计师们想让他的地图不可修改,但为什么呢?
我的要求是清理组件的所有属性。我该怎么做,而不是给每个二传手打电话?我不能在属性映射上调用clear(),因为它抛出了一个UnsupportedOperationException
因为它"不仅仅"是一个HashMap
左右。它是一个定制的地图,具有javadoc中提到的以下特定功能:
返回的实现必须支持所有标准和可选的Map方法,并支持以下附加要求:
Map
实现必须实现java.io.Serializable
接口- 任何添加
null
键或值的尝试都必须抛出NullPointerException
- 任何添加非
String
密钥的尝试都必须抛出ClassCastException
- 如果指定为键的属性名称与此
UIComponent
的实现类的属性匹配,则以下方法将具有特殊行为:
containsKey
—返回false
get()
-如果属性可读,则调用getter方法并返回返回的值(将基元值包装在相应的包装类中);否则抛出CCD_ 13put()
-如果属性是可写的,则调用setter方法来设置相应的值(在相应的包装器类中展开基元值)。如果属性不可写,或者试图将基元类型的属性设置为null
,则抛出IllegalArgumentException
remove
-投掷IllegalArgumentException
特别是CCD_ 19的特殊性。它并不是"只是"返回与映射键相关联的值,而是在请求component.getAttributes().get("foo")
时实际调用当前组件上的getter方法,例如component.getFoo()
。这些getter方法通常反过来委托给StateHelper
。
setAttributes()
将允许重写,从而破坏这个契约,并可能导致整个JSF组件树工作失败。