0

我有类似的东西

public class Toys {

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

}

Registry 跟踪所有类型为 Toy 的对象。当提供密钥时,它将返回有效的玩具实例。

当我这样做时,Toys.BAT,它给了我空值,但 Registry.getToy("BAT") 用有效的玩具实例返回给我。

公共类注册表{

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

导入静态 org.junit.Assert.*;

导入 org.junit.Before;导入 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 仍然有 null 值。

4

3 回答 3

2

当然,必须查看代码Registry才能知道问题出在哪里。

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

于 2012-04-20T13:52:31.930 回答
1

你检查过 Bat 和 BAT 的情况吗

于 2012-04-20T13:48:25.820 回答
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 类之前初始化注册表中的值。我同意评论者说这不是初始化这些的好方法。

于 2012-04-20T15:28:03.783 回答