使用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
答案 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");
}
}
最安全的做法是:
你可以调用最终方法,但是你必须确保它们不会调用可重写的方法......这可能意味着事情会破坏道路......所以更安全,不要这样做。
答案 1 :(得分:1)
在这种情况下(我希望)this
没有发布。它仍然只能通过MyCustomAction
实例访问。
在Java中(我相信C#正好相反),在对超级构造函数的(隐式或显式)调用之前直接调用实例字段初始化和实例初始化。因此,您可以在字段初始化中使用this
,尽管您的对象可能尚未完成构建。
发布this
以便在构建期间从对象外部可以访问它通常是一个坏主意。