void getter修改参数

时间:2013-01-08 11:59:05

标签: android

我找到了一些安卓代码(link):

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

只是想知道 - 是什么让这篇文章的作者以这种方式实现它? (为什么它修改参数而不是返回新对象?Get-methods通常是哑的,有返回值,不修改参数。我错了吗?)

我能从头脑中获得的唯一理由是 - 效率。此方法的用户可以控制创建的Point对象的数量。但设计这样的API是一个好习惯吗?

UPD:

我会像这样实现它(或类似的smth):

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

3 个答案:

答案 0 :(得分:3)

如果批量调用此方法,删除不必要的对象创建可以显着提高性能。当您开始查看被调用的低级代码和方法时,您就开始进行这些优化。

getSize()这样的方法的问题是你真的想要返回一个原语。如果getSize()返回了int,则这不是问题。在这种情况下,将参数传递给方法以用作“输出参数”是很常见的。

在J2ME中我们一直都是这样做的。特别是对于返回x / y坐标。在这种情况下,您有2个不会导致对象创建的选项:

  1. 创建2个方法:int getX()int getY()
  2. 创建一个将X和Y坐标写入传递参数的方法,如下所示:void getXY(int[] coords)
  3. 在第二种方法中,调用者分配一次int[2]数组(可能是静态的),然后可以使用相同的数组一次又一次地调用getXY()方法来传递坐标。

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

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

Java约定说,名为getXXX的方法不应该使用任何参数并返回值 吸气剂也应该优选没有副作用。

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