0

EventActionDispatcher の推奨される使用方法は次のとおりです (API ドキュメント @ http://struts.apache.org/1.2.9/api/org/apache/struts/actions/EventActionDispatcher.htmlによる) 。

   public class MyCustomAction extends Action {

       protected ActionDispatcher dispatcher = new EventActionDispatcher(this);

       public ActionForward execute(ActionMapping mapping,
                                    ActionForm form,
                                    HttpServletRequest request,
                                    HttpServletResponse response)
                           throws Exception {
           return dispatcher.execute(mapping, form, request, response);
       }
   }

これを行うと、コンストラクターが終了する前に「this」への参照が公開されますか? メソッド外のフィールド割り当てを管理する規則は何ですか。

前もって感謝します。

よろしくお願いします。

4

2 に答える 2

2

一度追跡するのに週に3人かかりました... EventActionDispatcherがスレッドを開始するか、「this」が使用される原因となるスレッドで何かを行う場合、「this」はnullになる可能性があります。

コンストラクターが完了する前に「this」を渡さないでください。そうしないと、スレッド化の場合に「this」が null になるリスクがあります。

私がやっていることは、そのようなことをする必要があるクラスに「init()」メソッドを追加し、オブジェクトを作成した後にそれを呼び出すことです。

この例のように、他の微妙な点もあります。

public abstract class Foo
{
    protected Foo()
    {
        car();
    }

    public abstract void car();
}

public class Bar 
    extends Foo
{
    private final String value;

    public Bar(final String str)
    {
        value = str;
    }

    public void car()
    {
        // this line will crash because value is null
        System.out.println(value.charAt(0));
    }
}

public class Main
{
    public static void main(final String[] argv)
    {
        final Foo foo;

        foo = new Bar("Hello");
    }
}

最も安全な方法は次のとおりです。

  • コンストラクターが戻る前に「this」を使用しないでください
  • クラスが final でない限り、コンストラクターからクラス独自の非静的メソッドを呼び出さないでください。

最終メソッドを呼び出すことはできますが、それらがオーバーライド可能なメソッドを呼び出さないようにする必要があります...そして、それは物事が道を壊すことを意味する可能性があります...そうしない方が安全です。

于 2009-03-23T22:25:20.810 に答える
1

この場合 (私は願っています)thisは公開されません。MyCustomActionインスタンスを介してのみ到達可能です。

Java では (C# は反対のことをしていると思います)、インスタンス フィールドの初期化とインスタンス初期化子は、スーパー コンストラクターへの (暗黙的または明示的な) 呼び出しの直前に呼び出されます。したがってthis、オブジェクトの構築が完了していない可能性がありますが、フィールドの初期化で使用できます。

構築中にオブジェクトの外部からアクセスできるようにパブリッシュthisすることは、一般的には悪い考えです。

于 2009-03-23T21:30:04.453 に答える