0

UIComponentBaseには public abstract Map<String, Object> getAttributes()メソッドがありますが、setAttributes()メソッドがありません。なぜこれがこのように設計されているのですか?デザイナーは彼の地図を変更できないようにしたいと思っていたと思いますが、なぜそうなのですか?

私の要件は、コンポーネントのすべての属性をクリーンアップすることです。各セッターを呼び出す代わりに、どうすればよいですか?UnsupportedOperationExceptionがスローされるため、属性マップでclear()を呼び出すことができません

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")が要求された場合)。これらのゲッター メソッドは通常、StateHelper.

setAttributes()をオーバーライドすると、このコントラクトが破られ、JSF コンポーネント ツリー全体が機能しなくなる可能性があります。

于 2013-02-08T12:19:00.047 に答える