我怎么知道变量的初始化位置

时间:2013-05-30 01:28:17

标签: java spring

我们在应用程序中使用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中是否有任何配置?

2 个答案:

答案 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的实例时,该实例也是如此变量