我问非常通用的问题,答案可能因要求而异,但对于“一般”或“经验法则”,我们可以说以下是一个好的设计规则:
要缓存的类(静态/引用数据)应设计为 不可改变的,有例外的理由。
如果不是这样,上述陈述的设计/性能问题可能是什么?
答案 0 :(得分:2)
@JohnB对底层数据有一个很好的答案。
但是,如果问题是指缓存类本身的不变性(将数据保存在缓存中),那么答案是如果类的实例是可变类,则可变类会导致线程安全问题由多个线程引用(通常在通过缓存共享的数据时发生)。此外,可能会发生“意外”修改数据,其中无意中修改了共享实例(因为修改代码不知道数据是共享的)。
答案 1 :(得分:1)
这是因为缓存的作用是保存数据而不是再次从数据源中检索数据。例如,您在数据库中查询值,然后将其放入基于内存的缓存中,这样您就不必再次查询数据库。但是,如果DB中的值可以更改,则缓存中的值将过期,并且您的应用程序将使用错误的数据。
因此,如果数据在应用程序的实时期间无法更改,则最好进行缓存。如果数据可以更改,则必须制定策略以定期检查数据是否已更改。
答案 2 :(得分:0)
换句话说,jtahlborn正在解释:不可变类将提供获取“静态”数据的方法。
如果你的类是不可变的,除了构造函数中的参数外,你不会有setter。
注意这一点:不可变类不只能使用一次,这会导致性能下降,因为每次访问get时都必须完成内部属性的复制。 ..方法。
示例:
class MyImmutableThing {
private final String myProperty;
MyImmutableThing(String myProperty) {
this.myProperty = myProperty;
}
String obtainMyProperty() {
return myProperty;
}
// note there is no mean to modify the myProperty value : the original value remains ;)
// That's it !
}