Java 如果getter只是一个简单的委托,我应该缓存它的返回值吗?

Java 如果getter只是一个简单的委托,我应该缓存它的返回值吗?,java,Java,例如: 我正在创建一个CSV文件,我有一个CsvOptions对象,其中包含用于创建CSV文件的多个参数 if (cells.hasNext()) { output.write(csvOptions.getDelimiter()); } csvOptions只是一个简单的容器对象,您可能根本不想使用任何getter。getter只是从私有字段返回值 在我的示例中,缓存一个普通getter的返回值(如getDelimiter())值得吗 。。。执行速度 。。。编码风格 缓存不应该是一个

例如:

我正在创建一个CSV文件,我有一个
CsvOptions
对象,其中包含用于创建CSV文件的多个参数

if (cells.hasNext()) {
    output.write(csvOptions.getDelimiter());
}
csvOptions
只是一个简单的容器对象,您可能根本不想使用任何getter。getter只是从私有字段返回值

在我的示例中,缓存一个普通getter的返回值(如
getDelimiter()
)值得吗

  • 。。。执行速度
  • 。。。编码风格

    • 缓存不应该是一个选项。
      如果它是一个容器,则使其不可变,即使其所有字段都是最终的公共字段。

      JIT应该能够在运行时内联所有琐碎的getter。所以这不是一个真正的问题


      关于编码风格,我更喜欢直接调用,除非它在只需要一次值的情况下使行太长。

      我相信Martin Fowler的重构明确建议不要这样做

      char delimiter = csvOptions.getDelimiter();
      
      // code here to use delimiter
      
      相反,他喜欢使用

      csvOptions.getDelimiter()
      
      直接的。这一论点有两个方面。首先应该有最小的性能开销,编译器和JITER可以优化函数调用。其次,通过使用该方法,我们实际上使代码在将来更容易重构


      请参见

      缓存?你的意思是将结果分配给一个变量,可能是为了以后的重用?是的,我就是这么想的。我没有想出更好的词。有吗?正是我要写的+1:)在同步getDelimiter()的情况下呢?那么JIT可以做任何优化吗?最初的问题是假设类是不可变的,因此同步问题不会出现。不,同步将有开销。但是,如果需要同步,那么对象可能正在更新,因此存在一致性问题。单独调用getX()和getY()可能没有意义,因为它们不能保证一致性。相反,您可以调用getSnapshot(),并缓存该结果。