2009-08-25 6 views
0

例:単純なデリゲートであれば、ゲッターの戻り値をキャッシュする必要がありますか?

私はCSVファイルを作成していますが、私はCsvOptionsオブジェクトを持っていて、CSVファイルの作成にいくつかのパラメータを保持しています。

if (cells.hasNext()) { 
    output.write(csvOptions.getDelimiter()); 
} 

csvOptionsは単なるコンテナオブジェクト、あなたがまったくゲッターを使用しないように誘惑されているようなものです。 getterはprivateフィールドから値を返します。

それは

  • ...実行速度の面で、私の例ではgetDelimiter()のように、些細なゲッターの戻り値をキャッシュする価値がありますか?
  • ...コーディングスタイル?
+0

キャッシュ?結果を後で再利用するために変数に代入することを意味しますか? – djna

+0

はい、それは私が考えていたものです。私はより良い言葉を思いついたわけではありません。何かありますか? –

答えて

1

私はMartin Fowler氏のリファクタリングが明示的に代わり、彼が直接

csvOptions.getDelimiter() 

を使用して有利に働くこの

char delimiter = csvOptions.getDelimiter(); 

// code here to use delimiter 

をやってない表彰することを信じています。引数は2倍です。最初にパフォーマンスのオーバーヘッドが最小限に抑えられ、コンパイラとJITersは関数呼び出しを最適化できます。次に、このメソッドを使用することで、実際にコードを将来リファクタリングするのが容易になります。

Fowler's book referenced here

+0

getDelimiter()が同期されている状況はどうですか? JITは最適化を実行できますか? – Adamski

+0

元の質問は、クラスが免疫力があると仮定しているため、同期された質問は発生しません。いいえ、同期化にはオーバーヘッドがあります。しかし、同期が必要な場合は、オブジェクトが更新されている可能性があり、一貫性の問題があります。 getX()とgetY()を別々に呼び出すことは意味がありませんが、一貫性があるとは限りません。むしろ、getSnapshot()を呼び出すことができます。その結果、**キャッシュされます。 – djna

2

キャッシングはオプションであってはなりません。 コンテナの場合は、不変にします。つまり、すべてのフィールドを最終的にパブリックにします。

4

JITは、実行時にすべての簡単なゲッターをインライン化できる必要があります。だから、これは本当に心配ではありません。

コーディングスタイルに関しては、値が1回だけ必要なときに、長すぎる場所に行を作成しない限り、ダイレクトコールを使用することをお勧めします。

+0

ちょうど私が書こうとしていたもの+1: –

関連する問題