我有类似
的东西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仍然具有空值。
答案 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类之前初始化注册表中的值。我同意评论者说这不是初始化这些的好方法。