2

Java のパフォーマンスに関する非常に重要でない質問ですが、今日は疑問に思いました。

単純なゲッターがあるとします:

public Object getSomething() {
     return this.member;
}

ここで、関数/アルゴリズムで getSomething() の結果が 2 回 (またはそれ以上) 必要だとします。私の質問: getSomething() を 2 回 (またはそれ以上) 呼び出すか、一時的なローカル変数を宣言して、それ以降この変数を使用することに違いはありますか?

つまり、どちらか

public void algo() {
    Object o = getSomething();

    ... use o ...
}

また

public void algo() {
    ... call getSomething() multiple times ...
}

特に理由はありませんが、両方のオプションを混在させる傾向があります。私はそれが問題ではないことを知っていますが、私はただ疑問に思っています.

ありがとう!

4

3 に答える 3

6

技術的には、メソッドを複数回呼び出さない方が高速ですが、常にそうであるとは限りません。JVM はメソッド呼び出しをインラインに最適化する可能性があり、違いはまったくわかりません。いずれにせよ、違いはごくわずかです。

ただし、常にゲッターを使用する方がおそらく安全です。呼び出し間で状態の値が変化した場合はどうなるでしょうか? 一貫したバージョンを使用する場合は、最初の呼び出しから値を保存できます。それ以外の場合は、常にゲッターを使用する必要があります。

いずれにせよ、この決定をパフォーマンスに基づいて行うべきではありません。私は1つを選び、一貫してそれに固執します。常にゲッター/セッターを通過することをお勧めします。

于 2012-05-15T20:49:39.563 に答える
1

ゲッターとセッターは、カプセル化と抽象化に関するものです。ゲッターを複数回呼び出すことにした場合、そのクラスの内部動作について仮定を立てています。たとえば、コストのかかる計算を行わないこと、または値が他のスレッドによって変更されないことなどです。

ゲッターを一度呼び出して、その結果を一時変数に格納する方が良いと私は主張します。これにより、実装クラスを自由にリファクタリングできます。

逸話として、ゲッターが配列を返すという変更に噛まれたことがありましたが、実装クラスが配列プロパティからリストを使用し、ゲッターで変換を行うように変更されました。

于 2012-05-15T21:44:44.470 に答える
0

コンパイラは、どちらも基本的に同じコードになるように最適化する必要があります。

于 2012-05-15T20:49:45.603 に答える