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