2

特に、「faces-config.xml」で宣言されたクラス「UserBean」のセッションスコープのBean「userBean」を持つJSFアプリケーションのいくつかのバグを修正しようとしています。メソッドの 1 つには、次のようなコード行があります。

public void doSomething() {
    ...
    UserBean userBean = (UserBean) facesContext.getApplication().evaluateExpressionGet(facesContext, "#{userBean}", UserBean.class);
    ...
}

「これ」だけでなく、その長い表現を使用する理由はありますか? または、すべてが適切に宣言されている場合、メソッドが実行されているインスタンスが実際にセッションに関連付けられた Bean であると確信できますか?

4

1 に答える 1

2

参照を比較し、メソッドの実行をトリガーするだけで同じBeanであるかどうかをテストして、何が起こるかを確認できます。

public void doSomething() {
    UserBean userBean = (UserBean) facesContext.getApplication().
      evaluateExpressionGet(facesContext, "#{userBean}", UserBean.class);
    if (this == userBean){
        System.out.println("\nIt is the same bean, time for some cleanup!");
    } else {
        System.out.println("\nThere is something very weird going on here...");
    }
}

覚えておいてください、thisそしてそれuserBeanは単なる参照であり、メモリ内の領域を指しています。それらが常に同じである場合は、式を。で安全に置き換えることができますthis

誰かが最初に別の場所でコードを記述し、次に誰かがそれをリファクタリングしてこのコードを同じBeanに移動し、この参照を変更するのを忘れた場合に、これが発生することがわかります。

于 2012-08-04T19:00:18.277 に答える