2009-09-17 6 views
7

最近、同じアクセサーへの複数回の呼び出しを避けるために、ゲッターをローカル変数に呼び出した結果をJavaに割り当てることをお勧めします。私は元の投稿を見つけることができませんが、コンセンサスは、ホットスポットがメソッド呼び出しのオーバーヘッドをどうにか最適化するので、これは一般的に必要ではないように思われました。複数のキャストを避けるためのローカル変数の割り当て

しかし、複数のキャストを避けるためにこの手法を使用することについての考え方は何ですか?それは、よりクリーンに見えるように私は、最初のを好む

if (a instanceof Foo) { 
    // Cast once and assign to local variable. 
    Foo foo = (Foo)a; 

    if (foo.getB() == 1 && foo.getC() == 2) { 
    ... 
    } 
} 

OR

if (a instanceof Foo) { 
    // Cast twice making code compact but possibly less readable. 
    // Also, is there an overhead in multiple casts? 
    if (((Foo)a).getB() == 1 && ((Foo)a).getC() == 2) { 
    ... 
    } 
} 

答えて

12

間違いなく最初に行ってください。パフォーマンスの差は無関係ですが、可読性はであり、確かにが改善されています。

キャストを削除するだけでなく、別の名前を使用することもできます。結局のところ、この変数について詳しく知っているので、より具体的な名前を付けるのが適切かもしれません。それは必ずしもそうではありませんが、そうであってもかまいません。リファクタリング技法は、たとえキャストがなくても、評価されていないものです。

3

:現時点では私は間の選択に直面しています。 2番目はLispのように見え始めています。しかしそれは単なる個人的意見です。

+0

Lispで何が問題になっていますか? –

+2

何も、私はLispを愛していません。ちょうどかっこがたくさんあります。それだけです。 –

19

私は、可読性の問題のために常にキャスティングするのではなく、ローカル変数を作成する方が好きです。私(または同じコードで作業している他の開発者)にとって、コードの可読性は重要な問題です。

この段階でのパフォーマンスについて心配すると、「時期尚早の最適化」パターンの例として私が驚いています。

+0

ありがとうございました - これは実際に私の好ましいアプローチです。私はちょうどプログラマーのコミュニティからいくつかの検証をしたかった。 – Adamski

1

明快さを向上させることは絶対に良いアイデアです。私はそれも複数のアクセサの呼び出しを避けるために適用されると言うでしょう - パフォーマンスの理由ではなく、明快さのための良い考えです。

3

私は重要なことは時期尚早に最適化しないことです。キャスティングにオーバーヘッドがある場合、実際には目立たないほど小さくなる可能性があります。このコードスニペットがアプリケーションのCPU時間の大部分を占めていない限り、私はこの2つの間に測定可能なパフォーマンスの違いは見られないと思います。

私はまた、よりクリーンで見やすく、わかりやすく、99.99%の状況で2クロックサイクルを実行するよりもはるかに重要です。

1

私は二つの理由

  1. 必要な括弧のために、最初のオプションを好むが
  2. を読み取るために、コードcludgyとハードを作る(小)オーバーヘッドは私が
0

キャストにおそらくありますコードの可読性だけでなく、実行時のデバッグのために、最初のものを優先します(元の例でも - ゲッターの結果をローカルに置くと、最初にゲッターにトレースするのではなくその値が表示されます) 。

0

私は最初のバージョンが望ましいと言う人に同意しますが、できる限り可能ならば、それを追加したいと思います。ほとんどの場合可能です。最初のキャストは避けるべきです。パフォーマンス上の理由からではなく、コードの正しさをさらにチェックするためです。

関連する問題