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

这是空对象模式的一个实现:一个特殊的对象 ,被指定在不允许“真实”s 的情况下BigDecimal(-99)扮演角色。nullnull

唯一的要求是空对象必须不同于所有“常规”对象。这样,下次程序需要查找没有区域的条目时,它需要做的就是NO_REGION按键查找。

于 2012-08-17T10:26:00.403 回答
1

区域由哈希表(键)中的 BigDecimal 标识 - 如果未提供区域(空),则使用默认值 -99。

于 2012-08-17T10:23:26.940 回答
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 回答
0

似乎哈希表的编写者使用 NO_REGION 作为没有区域的值的键。所以,读者也在做同样的事情。

于 2012-08-17T10:25:42.147 回答