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

时间:2013-02-08 12:10:52

标签: java jsf

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

我的要求是清理组件的所有属性。我怎么这样做而不是打电话给每个人?我无法在属性地图上调用clear(),因为it throws a UnsupportedOperationException

1 个答案:

答案 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组件树失败。