2017-08-11 7 views
0

Javaに関して、私はすべての変数を私的に宣言し、一般的な慣習に当てはまるパブリックゲッターとセッターを生成することに非常に慣れています。私はしかし、それは好奇心を見つけるパブリック変数の使用によるパフォーマンスの向上?

String getValue() { 
    return value; 
} 

の代わり:

要求された値を代入して返すの外にいない機能を持つゲッターとセッターとの関係では、のようなメソッドを呼び出すためのパフォーマンスへの影響はありません
classInstance.value; 

コンパイラは、関数呼び出しで余分なサイクルが追加されないようにするためにここで何かしますか?そうでない場合、この理論的なヒットスノーボールは、より堅牢なアプリケーションで大ヒットにならないでしょうか?あなたがまたはアクセサメソッドを使用すべきでない理由は、この質問を求めていません

編集::明確にするため 、質問はあなたがアクセサを使用してヒットパフォーマンスを取るかどうかではありません。

+1

非常に広い質問ですが、一般的にマイクロオプティマイゼーションを使用していないため、読みやすくすることが重要です。 –

+0

十分に複雑なプログラムの範囲では、私はオーバーヘッドが無視できると思うでしょう – OldProgrammer

+0

私はそれが広すぎるとは思わなかった。パブリック変数を使用してgetterとsetterメソッドを定義するとJavaで余分な作業が追加されますか? 個人的に、私はclassInstance.getValue()がclassInstance.valueより読みにくいとは思わない。 – anomeric

答えて

3

コンパイラは、関数呼び出しで余分なサイクルが追加されないようにするためにここで何かしますか?

はい。

ホットスポットJITコンパイラは、短いメソッドをインライン展開し、単純なゲッターまたはセッターは、それを可能にするのに十分短いです。メソッドボディをインライン化すると、パラメータアセンブリとメソッド呼び出しのオーバーヘッドがなくなり、呼び出しメソッドのコンテキストでさらにローカル最適化が可能になります。

最終結果はゲッターとセッターを使用することが近代的なJVM(TM)上のパフォーマンスヒットではないということです

(いくつかの初期のAndroidのコンパイラはこれをしませんでしたが、これは修正されました。)

+0

実際に質問にお答えいただき、ありがとうございます。 – anomeric

0

Javaがそういうことをしているのかどうか分かりませんが、C++はそのようなものをインライン化できます。

ゲッターとセッターも使いたいですが、単純な変数よりも遅いです。

APIを作成していて、パフォーマンスが必要な場合にパブリック変数を選択する場合は、ゲッターとセッターに行ってください。可読性はそれほど重要ではありません。

+0

ゲッターが遅いと言うことは不可能です。コードが高度に実行されたときにJMVが最適化します –

+0

私はかつてゲッターとセッターの方が遅いことを実証する実験をしました。しかし、それは改善されているかもしれません。 – Professor901

+1

あなたの実験でJavaの最新バージョンの測定可能な差異が示された場合、ベンチマーク技術に問題がある可能性があります。 –

-2

ゲッターやセッターは単に値を返す/設定する以上のことがあると私は言うでしょう。内部実装をユーザーに公開しないでください。いつか、あなたはしたくないinstance.attributまたはsometime instance.getAttribut()を使用する必要があります。

+0

"は、要求された値を代入して返す以外の機能を持たないgettersおよびsetterに関して" – anomeric

関連する問題