Java 未分配静态值并返回空值

Java 未分配静态值并返回空值,java,static,junit,Java,Static,Junit,我有点像 public class Toys { public static Toy BAT = Registry.getToy("BAT"); public static Toy DOLL = Registry.getToy("DOLL"); } 其中Registry跟踪Toy类型的所有对象。当提供密钥时,它将返回有效的玩具实例 当我这样做时,Toys.BAT会给我null值,但Registry.getToy(“BAT”)会返回有效的Toy实例 公共类注册表{ private stati

我有点像

public class Toys {

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

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

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

公共类注册表{

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);
}
@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-注册处现在有玩具了


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

您是否检查了蝙蝠和蝙蝠的案例

您是否检查了蝙蝠和蝙蝠的案例

当然,查看
注册表的代码
是了解问题所在的必要条件


但一般来说,这样初始化静态变量是不安全的。可能在
玩具
类加载时,
注册表
仍未正确加载所有玩具条目。

当然有必要查看
注册表
的代码,以了解问题所在

@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)
}
但一般来说,这样初始化静态变量是不安全的。可能在
玩具
类加载时,
注册表
仍未正确加载所有玩具条目

@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)
}
在加载玩具类之前,需要初始化注册表中的值。我同意那些评论说这不是一个好的初始化方法



在加载玩具类之前,需要初始化注册表中的值。我同意评论者的说法,这不是一个好的初始化方法。

我手中的这根绳子。。。多长时间P没有注册表对象的完整源代码,我们不妨摇动一个神奇的8号球。我们需要看看
注册表
以及您是如何将东西放入其中的。在程序流中,您何时调用Toys.BAT?很可能上面的代码是在玩具在注册表中设置之前运行的。我已经附加了注册表代码。这只是一个hashmap.我手里的这根绳子。。。多长时间P没有注册表对象的完整源代码,我们不妨摇动一个神奇的8号球。我们需要看看
注册表
以及您是如何将东西放入其中的。在程序流中,您何时调用Toys.BAT?很可能上面的代码是在玩具在注册表中设置之前运行的。我已经附加了注册表代码。这只是一个hashmap..等待更多细节。现在这纯粹是猜测。可能getToy()的主体是空的,我们不知道。这意味着
Registry。getToy(“Bat”)
Registry.getToy(“Bat”)
在更多细节上是不同的。现在这纯粹是猜测。可能getToy()的主体是空的,我们不知道。这意味着
Registry.getToy(“Bat”)
Registry.getToy(“Bat”)
是不同的。在Toys类的初始加载期间,所有值都是空的。如果注册表稍后更新并添加所有玩具条目。。那么玩具球就叫做。。是否仍返回空值?@sbose加载类时,静态变量初始化一次。这通常是第一次使用该类。对于容器中的一个例子来说,这第一次可能是一个非常棘手的问题。比如,在Toys类的初始加载期间,所有的值都是空的。如果注册表稍后更新并添加所有玩具条目。。那么玩具球就叫做。。是否仍返回空值?@sbose加载类时,静态变量初始化一次。这通常是第一次使用该类。对于容器中的示例来说,这是非常棘手的一次。