我如何改善
这一段代码?
给定问题陈述的单元测试用例是什么?
码:
public class SlowDictionary {
private final Map<String,String> dict = new HashMap<String,String>();
public synchronized String translate (String word)
throws IllegalArgumentException {
if (!dict.containsKey(word)) {
throw new IllegalArgumentException(word + " not found.");
}
return dict.get(word);
}
public synchronized void addToDictionary (String word, String translation)
throws IllegalArgumentException {
if (dict.containsKey(word)) {
throw new IllegalArgumentException(word + " already exists.");
}
dict.put(word,translation);
}
public synchronized Set<String> getAllWords () {
return dict.keySet();
}
}
最佳答案
您要做的第一件事就是摆脱所有同步的关键字。
最简单的方法是将dict声明为ConcurrentHashMap:
private final ConcurrentMap<String,String> dict = new ConcurrentHashMap<String,String>();
这样做,您可以立即删除翻译的同步部分,因此它看起来像:
public String translate (String word) throws IllegalArgumentException { ..
这样做的原因是CCHM持有的有关最新阅读的合同。
最后,添加到字典可以如下所示:
public void addToDictionary (String word, String translation) throws IllegalArgumentException {
if (dict.putIfAbsent(word,translation)!=null) {
throw new IllegalArgumentException(word + " already exists.");
}
}
还要从getAllWords中删除sync。
编辑:考虑到汤姆的评论。在这种“例外情况”中仔细检查可能不值得。如果案件没有引发例外,那将是适当的。