我们在应用程序中使用J2EE和Spring。 我在我的应用程序中有这段代码:
public class StreamThread extends Thread implements Constants{
{
private Set<String> allsymbolSet= new HashSet<String>();
boolean switchTab(String tab) throws Exception
{
if (somecondition) {
SymbolsSet = allsymbolSet;
}
}
}
这个问题可能很有趣,但我还是在试试我的运气。
我不知道allsymbolSet
是如何设置的。
如何知道值allsymbolSet
的初始化位置?
allsymbolSet
不是静态的或不变的;它因用户而异。
Spring中是否有任何配置?
答案 0 :(得分:1)
你的问题老实说非常不清楚。我试着猜猜你要问的是什么
public class Foo {
{
private Set<String> bar = new HashSet<String>(); // 1
public void doSomething() {
assert bar != null; //2
}
}
在第1行,显然bar已初始化(使用new HashSet<>()
)。鉴于第2行中的断言没有失败,这意味着第1行以某种方式预先执行。这是你要问的问题吗?:
第1行的初始化何时执行?
如果是,则可以简单地将其视为:在超类构造函数调用之后,字段初始化逻辑和初始化块将自动“复制”到所有构造函数的开头。
以此为例:
public class Foo {
{
private Set<String> bar = new HashSet<String>(); // 1
{ // initializer
bar.add("BAR");
}
public Foo() {
someInitLogic();
}
public void doSomething() {
assert bar != null; //2
}
}
编译器将为您生成代码,使其看起来像:
public class Foo {
{
private Set<String> bar;
public Foo() {
super(); // auto-generated invocation of superclass ctor
bar = new HashSet<String>(); // field initialization and
bar.add("BAR"); // initializers
someInitLogic();
}
public void doSomething() {
assert bar != null; //2
}
}
答案 1 :(得分:0)
在哪里设置?
private Set<String> allsymbolSet= new HashSet<String>(); // Right here.
何时设置? When the instance is created。来自Java语言规范:
如果字段声明符包含变量初始值设定项,则它具有 对赋值变量的赋值(第15.26节)的语义,以及:...
- ...如果声明符用于实例变量(即非静态字段),则计算变量初始值设定项并且 每次创建类的实例时执行的赋值 (§12.5)。
它以这种方式工作的原因是你只使用allSymbolSet
来处理POJO。它不是由XML或构造函数参数连接的,也不是@Autowired
(这将是奇怪的),因此每当创建StreamThread
的实例时,该实例也是如此变量