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