0

私は次のようなものを持っています

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 インスタンスを返します。

パブリック クラス レジストリ {

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.*;

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 - レジストリにおもちゃができました

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 に答える