Java EventActionDispatcher是否可以发布;这";在建造师完成之前?

Java EventActionDispatcher是否可以发布;这";在建造师完成之前?,java,struts,thread-safety,Java,Struts,Thread Safety,建议使用EventActionDispatcher的方法如下(根据API文档@) 这样做是否会在构造函数退出之前发布对“this”的引用?管理方法之外的字段分配的规则是什么 提前谢谢 真诚地, LES在这种情况下(我希望)不会发布此。它仍然只能通过MyCustomAction实例访问 在Java中(我相信C#正好相反),实例字段初始化和实例初始化器在(隐式或显式)调用超级构造函数之前直接被调用。因此,您可以在字段初始化中使用此,尽管您的对象可能尚未完成构造 发布此以便在构建过程中可以从对象外部访

建议使用EventActionDispatcher的方法如下(根据API文档@)

这样做是否会在构造函数退出之前发布对“this”的引用?管理方法之外的字段分配的规则是什么

提前谢谢

真诚地, LES

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

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

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

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

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


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

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

在构造函数完成之前,切勿传递“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,否则不要从构造函数调用任何类自己的非静态方法

您可以调用final方法,但必须确保它们不调用可重写的方法。。。这可能意味着事情会在这条路上发生变化。。。所以不这样做更安全。

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

在构造函数完成之前,切勿传递“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,否则不要从构造函数调用任何类自己的非静态方法

您可以调用final方法,但必须确保它们不调用可重写的方法。。。这可能意味着事情会在这条路上发生变化。。。所以不这样做更安全。

顺序是父构造函数、实例变量、构造函数。在构造函数返回之前在线程中使用“this”是不安全的。构造函数调用超级构造函数,因此从技术上讲这是不正确的。虽然它做的第一件事是叫超级。从构造函数返回使其线程安全(除了final)没有什么特别神奇的。顺序是父构造函数、实例变量、构造函数。在构造函数返回之前在线程中使用“this”是不安全的。构造函数调用超级构造函数,因此从技术上讲这是不正确的。虽然它做的第一件事是叫超级。从构造器返回使其线程安全没有什么特别神奇的(除了期末考试)。这就是我所怀疑的。那么,为什么struts文档包含这个有害的小示例呢?我想这是另一个问题这就是我所怀疑的。那么,为什么struts文档包含这个有害的小示例呢?我想这是另一个问题我怀疑是这样的。但是,您还可以如何初始化调度程序?也许在操作的execute方法中仔细检查了惰性初始化?这可能有点过分了。该字段(dispatcher)以这种方式初始化整个代码库。。。这是一个奇迹,它的工作!!!如果调度程序启动了一个线程,那么是的,这是一个奇迹,它可以工作。。。可能不同的操作系统或不同的硬件配置会破坏它。看看这本书的第193/194页,它永远不能为空!离开构造函数没有什么神奇的地方(除了期末考试),所以你的规则太简单了。正如我所说,花了3个人一周的时间才弄清楚为什么“this”是空的——所以至少有一个VM可以为空。@Tom请证明上帝不存在。如果你能做到这一点,那么你可以证明这不能是空的。有可能证明某事确实发生了,但不可能证明它永远不会发生。我怀疑情况就是这样。但是,您还可以如何初始化调度程序?也许在操作的execute方法中仔细检查了惰性初始化?这可能有点过分了。该字段(dispatcher)以这种方式初始化整个代码库。。。这是一个奇迹,它的工作!!!如果调度程序启动了一个线程,那么是的,这是一个奇迹,它可以工作。。。可能不同的操作系统或不同的硬件配置会破坏它。看看这本书的第193/194页,它永远不能为空!离开构造器没有什么神奇之处(除了fina)