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()int getY()OR
  2. 创建一个将 X 和 Y 坐标写入传递参数的方法,如下所示:void getXY(int[] coords)

在第二种方法中,调用者分配一个int[2]数组一次(可能是静态的),然后getXY()可以使用相同的数组一次又一次地调用该方法来传递坐标。

于 2013-01-08T12:24:15.537 回答
2

原因是效率。在编写方式中,此方法的用户可以回收点实例并避免内存分配。该方法可能经常在draw视图代码中使用,在这里尽可能快地获得流畅的 UI 体验很重要。

分配新对象也意味着 GC 必须更频繁地启动。

于 2013-01-08T12:19:32.757 回答
2

正如其他人所指出的那样,正如您所怀疑的那样,作者可能会这样做是为了提高效率。

Java 约定说一个名为的方法getXXX不应该接受任何参数并返回一个值。
吸气剂最好也应该没有副作用。

他应该给这个方法一个不同的名字。

于 2013-01-08T12:34:25.577 回答