4

私はいくつかのAndroidコードを見つけました(リンク):

   public void getSize(Point outSize) {
      synchronized (this) {
          updateDisplayInfoLocked();
          mDisplayInfo.getAppMetrics(mTempMetrics, mCompatibilityInfo);
          outSize.x = mTempMetrics.widthPixels;
          outSize.y = mTempMetrics.heightPixels;
      }
   }

そして、疑問に思っているのは、この作品の作者がそのような方法でそれを実装した理由は何ですか? (なぜ、新しいオブジェクトを返す代わりにパラメーターを変更するのですか? Get メソッドは通常、愚かで、戻り値があり、パラメーターを変更しません。私は間違っていますか?)

私が頭のてっぺんから得ることができる唯一の理由は、効率です。このメソッドのユーザーは、作成される Point オブジェクトの数を制御できます。しかし、そのような API を設計することは良い習慣でしょうか?

更新:

私は次のように実装します(または同様の方法で):

   public Point getSize() {
      Point outSize = new Point();
      synchronized (this) {
          updateDisplayInfoLocked();
          mDisplayInfo.getAppMetrics(mTempMetrics, mCompatibilityInfo);
          outSize.x = mTempMetrics.widthPixels;
          outSize.y = mTempMetrics.heightPixels;
      }
      return outSize;
   }
4

3 に答える 3

3

このメソッドが頻繁に呼び出される場合、不要なオブジェクトの作成を削除すると、パフォーマンスが大幅に向上する可能性があります。頻繁に呼び出される低レベルのコードやメソッドを見始めると、この種の最適化が始まります。

のようなメソッドの問題は、getSize()本当にプリミティブを返したいということです。getSize()返された場合、intこれは問題になりません。このような場合、パラメーターがメソッドに渡されて「出力パラメーター」として使用されるのはかなり一般的です。

J2ME では、この種のことを常に行っていました。特に x/y 座標を返す場合。その場合、オブジェクトの作成を引き起こさない 2 つのオプションがあります。

  1. 2 つのメソッドを作成します: int getX()and int getY()OR
  2. 次のように、渡されたパラメーターに X 座標と Y 座標を書き込む単一のメソッドを作成します。void getXY(int[] coords)

int[2]2 番目のメソッドでは、呼び出し元が配列を 1 回 (おそらく静的に)割り当てるgetXY()と、同じ配列を使用して何度でもメソッドを呼び出して座標を渡すことができます。

于 2013-01-08T12:24:15.537 に答える
2

他の人が指摘したように、そしてあなたが疑うように、著者はおそらく効率のためにこのようにしました.

Java の慣例では、名前付きメソッドgetXXXは引数を取らず、値を返す必要があります。
また、ゲッターには副作用がないことが望ましいです。

メソッドに別の名前を付ける必要がありました。

于 2013-01-08T12:34:25.577 に答える
2

理由は効率です。書かれているように、このメソッドのユーザーはポイントインスタンスをリサイクルして、メモリ割り当てを回避できます。このメソッドは、おそらくdrawビューのコードでよく使用され、スムーズな UI エクスペリエンスのためにできるだけ高速であることが重要です。

新しいオブジェクトを割り当てるということは、GC がより頻繁に起動する必要があることも意味します。

于 2013-01-08T12:19:32.757 に答える