我问的是非常笼统的问题,答案可能因要求而异,但对于“一般”或“经验法则”,我们可以说以下是一个很好的设计规则:
要缓存的类(静态/参考数据)应设计为不可变的,并有例外。
如果这不是真的,上述陈述可能存在什么设计/性能问题?
我问的是非常笼统的问题,答案可能因要求而异,但对于“一般”或“经验法则”,我们可以说以下是一个很好的设计规则:
要缓存的类(静态/参考数据)应设计为不可变的,并有例外。
如果这不是真的,上述陈述可能存在什么设计/性能问题?
这是因为缓存的作用是保存数据,而不是再次从数据源中检索数据。例如,您在数据库中查询一个值,然后将其放入基于内存的缓存中,这样您就不必再次查询数据库。但是,如果数据库中的值可以更改,那么缓存中的值将过期,您的应用程序将使用错误的数据。
因此,如果数据在应用程序运行期间无法更改,则最好使用缓存。如果数据可以更改,则必须制定策略定期检查数据是否已更改。
@JohnB 对基础数据有一个很好的答案。
但是,如果问题是指缓存类本身(将数据保存在缓存中)的不变性,那么答案是,如果类的实例被多个引用,可变类可能会导致线程安全问题线程(通过缓存共享的数据经常会发生)。此外,可能会发生数据的“意外”修改,其中共享实例被无意修改(因为修改代码不知道数据是共享的)。
换句话说,jtahlborn 解释的是:一个不可变的类将提供获取“静态”数据的方法。
如果您的类是不可变的,则除了构造函数中的参数之外,您将没有设置器。
请注意:不可变类不会只使用一次,这会导致性能损失,因为每次访问 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 !
}