为什么 UIComponentBase 类不公开 setAttribute() 方法?



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_ 13
    • put()-如果属性是可写的,则调用setter方法来设置相应的值(在相应的包装器类中展开基元值)。如果属性不可写,或者试图将基元类型的属性设置为null,则抛出IllegalArgumentException
    • remove-投掷IllegalArgumentException

特别是CCD_ 19的特殊性。它并不是"只是"返回与映射键相关联的值,而是在请求component.getAttributes().get("foo")时实际调用当前组件上的getter方法,例如component.getFoo()。这些getter方法通常反过来委托给StateHelper

setAttributes()将允许重写,从而破坏这个契约,并可能导致整个JSF组件树工作失败。

相关内容

  • 没有找到相关文章

最新更新