编辑:fml!我的hashcode实现有一个小写的c.--
我一直在努力学习tdd,并一直遵循肯特贝克的“以身作则”的书;非常好!
但是,我似乎没有进展,因为当我访问哈希表时,一个值返回null。我已经运行了一个调试会话,带有该值的对象显然在那里,但是结果是空的。
要构建和访问的代码是:
public void addRate(String from, String to, int rate){
this.rates.put(new Pair(from, to), new Integer(rate));
}
从和到是“英镑”和“美元”。还通过调试进行了验证。
调用上述内容的测试用例:
@Test
public void testreduceMoneyDifferentCurrency(){
Bank bank = new Bank();
bank.addRate("GBP", "USD", 2);
Money result = bank.reduce(Money.gbpound(2), "USD");
assertEquals(Money.dollar(1), result);
}
bank中的reduce方法调用方法rate:
public Money reduce(Bank bank, String to){
int rate = bank.rate(this.currency, to);
return new Money(this.amount / rate, to);
}
这就是问题所在:
public int rate(String from, String to){
if (from.equals(to)) return 1;
Integer rate = (Integer) this.rates.get(new Pair(from, to));
return rate.intValue();
}
第一行处理美元->美元转换等。
pair对象是两个构造为用作密钥的字符串。
我没有经常使用has表,但我看不出问题是什么,我确定值在hashtable中,但是rate总是返回空值。
我看不见树林也看不见树木有人能给我指一下正确的方向吗?
2条答案
按热度按时间rta7y2nd1#
我认为问题出在
Pair
方法。当您这样做时:this.rates.get(new Pair(from, to));
您正在创建的新示例Pair
,这与您在addRate
方法。如果希望代码正常工作,则必须使用
Pair
分类或正确实施equals
以及hashCode
上的方法Pair
班级。下面是对hashmap内部工作的更深入的了解,以及如何使其工作:https://stackoverflow.com/a/6493946/2266098
2vuwiymt2#
java保存对象的引用。所以当你想这么做的时候
this.rates.get(new Pair(from, to));
您基本上是在创建Pair
在您的HashMap
.