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