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”的引用吗?管理方法之外的字段分配的规则是什么。

提前致谢。

真诚的,LES

4

2 回答 2

2

这需要 3 个人每周追踪一次......如果 EventActionDispatcher 启动一个线程或对导致使用“this”的线程执行任何操作,“this”可以为空。

切勿在构造函数完成之前传递“this”,否则在线程的情况下您将面临“this”为空的风险。

我所做的是向需要执行此类操作的类添加“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 回答