gpt4 book ai didi

java - EventActionDispatcher 可以在构造函数完成之前发布 "this"吗?

转载 作者:行者123 更新时间:2023-12-02 00:55:42 25 4
gpt4 key购买 nike

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

提前致谢。

真诚的,莱斯

最佳答案

每周需要 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方法,但您必须确保它们不会调用可重写的方法...这可能意味着事情会崩溃...所以不要这样做更安全。

关于java - EventActionDispatcher 可以在构造函数完成之前发布 "this"吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/675285/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com