2012-04-20 56 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) 
} 

您需要你的玩具類被加載之前在註冊表來初始化值。我同意評論者說,它不是初始化這些的好方法。