2012-04-20 99 views
0

我有类似静态值没有得到分配和返回空值

public class Toys { 

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

} 

其中注册表会类型玩具的所有对象的轨道。当提供一个键时,它将返回有效的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”)..

下面是其失败

进口静态org.junit的TestRegistry 。断言。*;

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); 
} 

}

上面打印

空 - 注册表犯规包含

玩具@ 80cac9玩具 - 注册表有玩具现在

null - Toys.BAT仍然为空值。

+5

这块绳子我在这里在我的手中......它有多长时间? :P如果没有完整的注册表对象的源代码,我们可能会动摇一个魔法8球。 – mcfinnigan 2012-04-20 13:48:05

+0

我们需要看看'Registry'以及你如何把东西放进去。 – 2012-04-20 13:48:24

+0

在程序流程中您是否在调用Toys.BAT? – LexyStardust 2012-04-20 13:50:07

回答

1

做你检查蝙蝠的情况和BAT

+1

等待更多细节。现在它是纯粹的猜测。也许getToy()有一个空的主体,我们不知道。 – UmNyobe 2012-04-20 13:50:57

+0

这意味着Registry.getToy(“Bat”)和Registry.getToy(“BAT”)是不同的 – 2012-04-20 13:52:13

2

无疑寻找到的Registry代码需要知道问题出在哪里。

但通常,初始化您的静态变量是不安全的。也许在Toys班的loadig时间,Registry仍然没有正确加载所有玩具条目。

+0

说,在玩具类的初始加载过程中,所有值都为空。如果注册表稍后更新并添加所有玩具条目..并且Toy.BALL被调用,那么..它仍然会返回空值? – sbose 2012-04-20 14:11:21

+0

@sbose静态变量在类加载时被初始化一次。这通常是第一次使用该课程。对于容器中的示例来说,这第一次可能会非常棘手。 – Stefan 2012-04-20 15:31:39

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) 
} 

您需要你的玩具类被加载之前在注册表来初始化值。我同意评论者说,它不是初始化这些的好方法。