3

我问的是非常笼统的问题,答案可能因要求而异,但对于“一般”或“经验法则”,我们可以说以下是一个很好的设计规则:

要缓存的类(静态/参考数据)应设计为不可变的,并有例外。

如果这不是真的,上述陈述可能存在什么设计/性能问题?

4

3 回答 3

2

这是因为缓存的作用是保存数据,而不是再次从数据源中检索数据。例如,您在数据库中查询一个值,然后将其放入基于内存的缓存中,这样您就不必再次查询数据库。但是,如果数据库中的值可以更改,那么缓存中的值将过期,您的应用程序将使用错误的数据。

因此,如果数据在应用程序运行期间无法更改,则最好使用缓存。如果数据可以更改,则必须制定策略定期检查数据是否已更改。

于 2012-08-22T17:42:24.417 回答
2

@JohnB 对基础数据有一个很好的答案。

但是,如果问题是指缓存类本身(将数据保存在缓存中)的不变性,那么答案是,如果类的实例被多个引用,可变类可能会导致线程安全问题线程(通过缓存共享的数据经常会发生)。此外,可能会发生数据的“意外”修改,其中共享实例被无意修改(因为修改代码不知道数据是共享的)。

于 2012-08-22T18:04:13.613 回答
0

换句话说,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 !
}
于 2012-08-22T18:25:50.210 回答