最终局部变量如何“避免重复调用”方法?

时间:2011-05-10 17:11:56

标签: java swing final

Creating a GUI with JFC/Swing > Perform Custom Painting : Refining the Design

我正在阅读上面链接的教程,部分示例代码让我感到困惑。根据{{​​1}}方法中的代码注释,将位置信息存储为最终局部变量

  

'避免重复调用   方法

这对我来说完全没有意义,我希望有人可以阐述评论的含义。 (请参阅上面的链接以获取完整的源代码和教程评论)

moveSquare

4 个答案:

答案 0 :(得分:2)

制作本地变量 final 并不会产生任何真正的区别,因为您怀疑。在某些情况下,它可以帮助JVM优化代码,但是JVM现在相当聪明,并没有多大帮助。

真正的区别在于结果存储为局部变量,以避免方法调用。

但是,由于方法调用很可能是微不足道的getter,JVM可以内联这些方法,因此性能差异可能不大。

如果变量未被访问或仅被访问过一次,则可能会影响性能。

重绘可能比这种方法贵1000倍,这使得这些变化不那么重要。

一般来说,我建议简化代码并清除编写代码时最重要的因素,并且JVM通常会非常有效地优化简单明了的代码。

答案 1 :(得分:2)

这意味着调用getX()或其他方法的结果会保存在变量中并重复使用,这样您就不必在每次需要X或Y时都继续调用这些方法。

这有三个好处:

  1. 由于变量名称
  2. ,代码更具可读性
  3. 由于不必一次又一次地调用方法,性能得到改善
  4. 未来的更改可能更容易,因为您只需要在一个地方更改方法名称,例如。

答案 2 :(得分:1)

最终变量的值只能设置一次。

如果您尝试多次设置最终变量的值,或者编写一个函数来设置最终成员变量的值,那么它会产生编译器错误。这可以确保您不能多次设置该值,这可以避免重复调用相同的方法。例如,如果您尝试再次写入:

CURR_X = redSquare.getX();

您会收到错误,因为您已经设置了最终变量。所以你要避免重复调用redSquare.getX()。在这种情况下,它并没有真正做太多,但在其他对象的实现中,该方法可能会产生巨大的计算。

答案 3 :(得分:0)

关于moveSquare函数的全部内容 - 与此相同:

private void moveSquare(int x, int y){

    final int OFFSET = 1;

    if ((redSquare.getX()!=x) || (redSquare.getY()!=y)) {

        // The square is moving, repaint background 
        // over the old square location. 
        repaint(redSquare.getX(),redSquare.getY(),redSquare.getWidth()+OFFSET,redSquare.getHeight()+OFFSET);

        // Update coordinates.
        redSquare.setX(x);
        redSquare.setY(y);

        // Repaint the square at the new location.
        repaint(redSquare.getX(), redSquare.getY(), 
                redSquare.getWidth()+OFFSET, 
                redSquare.getHeight()+OFFSET);
    }
}

正如您所看到的,通过不使用这些常量(只初始化一次),您最终再次调用getX()和getY()2次(尽管我认为JIT编译器会优化它!) - 但是,通过引入这些常量来保存这两个调用。 (这只有在使用常量时,在这些代码行中没有更改X的值时才会起作用 - 例如,if ((redSquare.getX()!=x) || (redSquare.getY()!=y))之后的行更改X或Y的值,您将无法使用常量方法并拥有来调用上面显示的函数,以获得正确的值。)