EventActionDispatcher可以在构造函数完成之前发布“this”吗?

时间:2009-03-23 21:23:21

标签: java struts thread-safety

使用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

2 个答案:

答案 0 :(得分: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”
  • 永远不会从构造函数中调用任何类自己的非静态方法,除非该类是最终的。

你可以调用最终方法,但是你必须确保它们不会调用可重写的方法......这可能意味着事情会破坏道路......所以更安全,不要这样做。

答案 1 :(得分:1)

在这种情况下(我希望)this没有发布。它仍然只能通过MyCustomAction实例访问。

在Java中(我相信C#正好相反),在对超级构造函数的(隐式或显式)调用之前直接调用实例字段初始化和实例初始化。因此,您可以在字段初始化中使用this,尽管您的对象可能尚未完成构建。

发布this以便在构建期间从对象外部可以访问它通常是一个坏主意。