Android 修改参数的void getter

Android 修改参数的void getter,android,Android,我发现了一些android代码(): 只是想知道-是什么让这篇文章的作者以这样的方式实现它?(为什么它修改参数而不是返回新对象?Get方法通常是哑的,有返回值,并且不修改参数。我错了吗?) 我能想到的唯一原因是效率。此方法的用户可以控制创建的点对象的数量。但是设计这样的API是一种好的实践吗 UPD: 我将这样实现它(或类似的smth): 原因是效率。通过编写方法,此方法的用户可以循环使用点实例并避免内存分配。该方法可能经常用于视图的draw代码中,在这里,尽可能快的速度对于平滑的UI体验非常重

我发现了一些android代码():

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

我能想到的唯一原因是效率。此方法的用户可以控制创建的点对象的数量。但是设计这样的API是一种好的实践吗

UPD:

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


原因是效率。通过编写方法,此方法的用户可以循环使用点实例并避免内存分配。该方法可能经常用于视图的
draw
代码中,在这里,尽可能快的速度对于平滑的UI体验非常重要


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

如果此方法调用过多,则删除不必要的对象创建可以显著提高性能。当您开始研究经常被调用的低级代码和方法时,您就开始进行此类优化

getSize()
这样的方法的问题是您确实想要返回一个原语。如果
getSize()
返回一个
int
值,这就不是问题。在这种情况下,将参数传递给方法作为“输出参数”是很常见的

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

  • 创建两个方法:
    intgetx()
    intgety()
  • 创建一个方法,将X和Y坐标写入传递的参数,如下所示:
    void getXY(int[]coords)

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

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

    Java约定称名为
    getXXX
    的方法不应带参数并返回值。
    吸气剂最好也没有副作用


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

    看看代码;如果他们不使用这种方法,就会创建3个新对象。两个用于
    getAppMetrics
    (这是使用单个get返回两个参数的唯一方法)。和一个点对象。就我个人而言,我认为他们的设计选择是正确的。@harism,我添加了另一段代码——只是多了一个对象,但现在看起来更正常了。是吗?
    mDisplayInfo.getAppMetrics
    也是一个无效的getter。一旦用返回新对象的getter替换它,在某些情况下,循环使用是一种很好的做法。解决方案1(2个getter)可能会在多线程程序中产生问题:如果调用
    getX
    getY
    之间的点发生变化,则会得到一个混合了2个点的点…@assylias!因此,您可能需要同步包含2个方法调用的块。不仅如此,还必须进行2次方法调用才能获得2个坐标也是低效的。第二种解决方案是我们通常使用的(d)。
       public void getSize(Point outSize) {
          synchronized (this) {
              updateDisplayInfoLocked();
              mDisplayInfo.getAppMetrics(mTempMetrics, mCompatibilityInfo);
              outSize.x = mTempMetrics.widthPixels;
              outSize.y = mTempMetrics.heightPixels;
          }
       }
    
       public Point getSize() {
          Point outSize = new Point();
          synchronized (this) {
              updateDisplayInfoLocked();
              mDisplayInfo.getAppMetrics(mTempMetrics, mCompatibilityInfo);
              outSize.x = mTempMetrics.widthPixels;
              outSize.y = mTempMetrics.heightPixels;
          }
          return outSize;
       }