2

ハッシュテーブルがヌルキーを許可していないことは知っています...しかし、以下のコードはどのように機能していますか。

そして、以下のコードで Big Decimal を -99 に初期化するとどうなりますか。

private static final BigDecimal NO_REGION = new BigDecimal (-99);

public List getAllParameters (BigDecimal region, String key) {
    List values = null;
    if (region==null) {
        region = NO_REGION;
    }
    Hashtable paramCache = (Hashtable)CacheManager.getInstance().get(ParameterCodeConstants.PARAMETER_CACHE);
    if (paramCache.containsKey(region)) {
        values = (List) ((Hashtable)paramCache.get(region)).get(key); 
    }

    return values;
}

長い間苦労していて、理解できません。

4

4 に答える 4

4

これはnull オブジェクト パターンの実装です。特別なオブジェクト は、 「実際の」が許可されていない状況でBigDecimal(-99)役割を果たすように指定されています。nullnull

唯一の要件は、null オブジェクトがすべての「通常の」オブジェクトとは異なる必要があるということです。このようにして、次にプログラムが領域のないエントリを検索する必要がある場合、必要なのはNO_REGIONキーによるルックアップだけです。

于 2012-08-17T10:26:00.403 に答える
1

私には貧弱なコードのように見えます-何かが短いために「長い間苦労している」場合、それは通常最良の指標です。

少し整理するだけで、おそらくもっと理にかなっているでしょう:

private static Hashtable paramCache = (Hashtable)CacheManager.getInstance().get(ParameterCodeConstants.PARAMETER_CACHE);

public List getAllParameters (BigDecimal region, String key) {
    List values = null;
    if (region != null && paramCache.containsKey(region)) {
        Hashtable regionMap = (Hashtable) paramCache.get(region); 
        values = (List) regionMap.get(key); 
    }
    return values;
}
于 2012-08-17T11:32:00.997 に答える
1

リージョンは、ハッシュ テーブル (キー) の BigDecimal によって識別されます。リージョンが指定されていない場合 (null)、デフォルト値の -99 が使用されます。

于 2012-08-17T10:23:26.940 に答える
0

ハッシュテーブルへのライターは、リージョンのない値のキーとして NO_REGION を使用したようです。だから、読者は同じことをしている。

于 2012-08-17T10:25:42.147 に答える