0

UIComponentBasepublic abstract Map<String, Object> getAttributes()方法但没有 setAttributes() 方法。为什么这样设计?我假设设计师想让他的地图不可修改,但为什么呢?

我的要求是清理组件的所有属性。我将如何这样做而不是调用每个 setter ?我无法在属性映射上调用 clear(),因为它会引发 UnsupportedOperationException

4

1 回答 1

4

因为它不是“只是”一个HashMap左右。这是一个自定义地图,具有javadoc中提到的以下特定功能:

返回的实现必须支持所有标准和可选的 Map 方法,并支持以下附加要求:

  • Map实现必须实现java.io.Serializable接口。
  • 任何添加键或值的尝试都null必须抛出NullPointerException.
  • 任何添加不是String必须的键的尝试都会抛出ClassCastException.
  • 如果指定为键的属性名称与 thisUIComponent的实现类的属性匹配,则以下方法将具有特殊行为:
    • containsKey- 返回false
    • get()- 如果属性可读,则调用getter方法并返回返回值(将原始值包装在其对应的包装类中);否则抛出IllegalArgumentException
    • put()- 如果属性是可写的,则调用 setter 方法来设置相应的值(在其相应的包装类中展开原始值)。如果该属性不可写,或者尝试将原始类型的属性设置为null,则抛出IllegalArgumentException
    • remove- 投掷IllegalArgumentException

特别是get()很特别。它不“只是”返回与映射键关联的值,而是实际上调用当前组件上的 getter 方法,例如component.getFoo(),当component.getAttributes().get("foo")被请求时。这些 getter 方法通常又委托给StateHelper.

setAttributes()将允许覆盖并因此破坏此合同,并可能导致整个 JSF 组件树工作失败。

于 2013-02-08T12:19:00.047 回答