将对象缓存为不可变类

时间:2012-08-22 17:32:05

标签: java performance caching immutability

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

  

要缓存的类(静态/引用数据)应设计为   不可改变的,有例外的理由。

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

3 个答案:

答案 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 !
}