-1

我们在应用程序中使用 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中有这样的配置吗?

4

2 回答 2

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
    }
}
于 2013-05-30T01:49:37.750 回答
0

它在哪里设置?

private Set<String> allsymbolSet= new HashSet<String>(); // Right here.

什么时候设置? 创建实例时。来自 Java 语言规范:

如果字段声明器包含变量初始化器,则它具有对声明变量的赋值(第 15.26 节)的语义,并且: ...

  • ...如果声明器用于实例变量(即非静态字段),则每次创建类的实例时都会评估变量初始化器并执行赋值(第 12.5 节)。

它以这种方式工作的原因是您只使用allSymbolSet. 它不是由 XML 或构造函数参数连接的,也不是@Autowired(这会很奇怪),所以每当StreamThread创建一个实例时,该实例变量也是如此。

于 2013-05-30T02:02:29.377 回答