静态值未分配并返回空值

时间:2012-04-20 13:45:47

标签: java static junit

我有类似

的东西
public class Toys {

public static Toy BAT = Registry.getToy("BAT");
public static Toy DOLL = Registry.getToy("DOLL");

}

其中Registry保留了Toy类型的所有对象的轨迹。当提供密钥时,它将返回有效的Toy实例。

当我这样做时,Toys.BAT会给我null值,但是Registry.getToy(“BAT”)会返回有效的Toy实例。

public class Registry {

private static final HashMap<String, Toy>  _toysMap = new HashMap<String, Toy>();


public static void putToy( String toyCode, Toy toy) {
    _toysMap.put( toyCode, Toy ) ;
}

public static Toy getToy(String toyCode ) {
    return _toysMap.get( toyCode);
}

}

我遗失了哪些非常明显的东西?

另外,我同时调用了Registry.getToy(“BAT”)和Toys.getToy(“BAT”)..

这是失败的TestRegistry

import static org.junit.Assert。*;

import org.junit.Before; import org.junit.Test;

公共类TestRegistry {

@Before
public void setUp() throws Exception {
    System.out.println(Toys.BAT);
    Registry.putToy("BAT", new Toy());
    Registry.putToy("DOLL", new Toy());
}

@Test
public void test() {
    System.out.println(Registry.getToy("BAT"));
    System.out.println(Toys.BAT);
    assertTrue(Registry.getToy("BAT") == Toys.BAT);
}

}

以上打印

null - 注册表不包含玩具

Toy @ 80cac9 - Registry现在有玩具

null - Toys.BAT仍然具有空值。

3 个答案:

答案 0 :(得分:2)

当然需要查看Registry的代码才能知道问题所在。

但一般来说,初始化这样的静态变量是不安全的。也许在Toys级的加载时间,Registry仍未正确加载所有玩具条目。

答案 1 :(得分:1)

你检查了Bat和BAT的案例

答案 2 :(得分:0)

@Before
public void setUp() throws Exception {
    System.out.println(Toys.BAT); --> Loads class and initializes static variables
    Registry.putToy("BAT", new Toy()); --> populates Registry (HashMap)
    Registry.putToy("DOLL", new Toy()); --> populates Registry (HashMap)
}

您需要在加载Toys类之前初始化注册表中的值。我同意评论者说这不是初始化这些的好方法。