我想知道一个愚蠢的问题,但我喜欢学习:)
假设我得到以下代码:
public String method(<T> a)
{
String dataA = a.getB().getC().getD();
}
在什么时候,定义一个缓存我们的请求并保存以下内容的映射会变得有趣:
Map<<T>, String> m;
m.put(a, dataA);
然后当然,[SNIP通常测试无效性,如果对象丢失则添加对象,等等,再加上刷新问题]返回m.get(a);
让我强调一下,连续的get并不昂贵(没有DB调用或JNDI查找之类的东西)。
只是,如果我们定义一个字典,而不是阅读整串的"get",会更清楚。
我认为,在CPU时间上,拨打get电话几乎是"免费的"。同样,我认为从哈希图中检索数据并不是完全免费的,而是几乎免费的(至少在我的情况下,它是:)。
我的问题实际上是关于可准备性,而不是性能。
谢谢!
为了提高可读性(并减少依赖性),您应该在A中定义一个访问器,例如
public String getDataA() {
return getB().getC().getD();
}
然后你的呼叫代码变成
String dataA = a.getDataA();
你可能会说,在A中,你需要太多这样的快捷方式,使它的接口混乱不堪。这实际上是一个类设计问题的标志。要么A变得太大太复杂了(在这种情况下,最好将其划分为多个类),要么需要所有这些遥远数据片段的代码实际上属于其他地方,比如B或C,而不是A的客户端。
需要考虑的几件事:
Apache Beanutils有很多用于这类事情的实用程序:http://commons.apache.org/beanutils/
java.util.properties,如果值都是字符串
如果你真的想访问这样的东西,你也可以考虑使用groovy。groovy中对映射的所有查找都可以用"完成表示法,它还支持一个"安全"访问器,该访问器将检查null。
MVEL是另一个选项:
String d = (String) MVEL.eval("b.?c.?d", a);
我要说的是,数据字典会导致类型安全问题。不能保证每个人都在正确的数据元素中放入正确的类型,甚至定义所有必需的元素。
此外,当使用如上所述的表达式语言时,也存在类型安全问题,因为没有对实际表达式进行编译时检查,以确保a)它有意义,b)它返回正确的类型。