希望我不要问重复。我尝试过搜索但没有找到任何内容,但这可能是我的关键字选择(我无法想到要使用的关键字)。
通常,在编码时,遇到以下情况:
public void doStuff() {
String sharedValue = getValue();
// code block 1 that uses sharedValue
// code block 2 that uses sharedValue
}
private String getValue() {
// code to get sharedValue
}
例如,这可能是哈希表类,getValue()
对应于哈希函数。
理想情况下,code block 1
和code block 2
将模块化为两个单独的方法,如下所示:
public void useValue1() {
String sharedValue = getValue();
// code block that uses sharedValue
}
public void useValue2() {
String sharedValue = getValue();
// code block that uses sharedValue
}
现在问题是,如果我们调用useValue1()
然后调用useValue2()
,则getValue()
会运行两次。 使用Java HashMap
作为示例 :
public class Clazz {
Map<String, List<String>> map = new HashMap<String, List<String>>();
public void ensureListExists(String key) {
if (!map.containsKey(key))
map.put(key, new ArrayList<String>());
}
}
HashMap.containsKey()
和HashMap.put()
计算两次相同的哈希密钥。在这种情况下,计算散列键对于操作来说并不算太昂贵,但是想象一些更昂贵的东西也不会太难。
以下是我想到的一些解决方案以及为什么我不喜欢它们:
&GT;使用缓存:在某些情况下,这可能是我选择的解决方案,可能是对于长期存在的对象(例如,保留所有数据库查询的缓存及其结果)。在较小的范围内,我不喜欢创建一个实例变量的想法,仅用作一对方法的缓存,并且只能使用一次或两次。另外,缓存还有自己的开销。
&GT;将String sharedValue
提取到useValue1(String)
和useValue2(String)
的参数中,然后从调用方法中调用getValue()
,如下所示:
public void useValue1(String sharedValue) {
// code block that uses sharedValue
}
public void useValue2(String sharedValue) {
// code block that uses sharedValue
}
String sharedValue = getValue();
useValue1(sharedValue);
useValue2(sharedValue);
getValue()
为public
并强制调用方法手动处理sharedValue
。它应该是自动的并且作为实现细节隐藏 - 并非所有Maps都实现为哈希表。sharedValue
是多个变量,则不起作用。每个人都知道多个返回值很糟糕(至少在Java中)。我们可以创建另一个封装所有变量的类,但这比使用实例变量更加混乱。有谁能想到这个问题的优雅解决方案?我总是能看到它。也许没有其他解决方案,我只是太挑剔了。我愿意接受这个作为答案。
注意:我认为这可能看起来像预优化,但我认为我认为这足以保证在任何时候都有一个很好的解决方案。