Creating a GUI with JFC/Swing > Perform Custom Painting : Refining the Design
我正在阅读上面链接的教程,部分示例代码让我感到困惑。根据{{1}}方法中的代码注释,将位置信息存储为最终局部变量
'避免重复调用 方法
这对我来说完全没有意义,我希望有人可以阐述评论的含义。 (请参阅上面的链接以获取完整的源代码和教程评论)
moveSquare
答案 0 :(得分:2)
制作本地变量 final 并不会产生任何真正的区别,因为您怀疑。在某些情况下,它可以帮助JVM优化代码,但是JVM现在相当聪明,并没有多大帮助。
真正的区别在于结果存储为局部变量,以避免方法调用。
但是,由于方法调用很可能是微不足道的getter,JVM可以内联这些方法,因此性能差异可能不大。
如果变量未被访问或仅被访问过一次,则可能会影响性能。
重绘可能比这种方法贵1000倍,这使得这些变化不那么重要。
一般来说,我建议简化代码并清除编写代码时最重要的因素,并且JVM通常会非常有效地优化简单明了的代码。
答案 1 :(得分:2)
这意味着调用getX()或其他方法的结果会保存在变量中并重复使用,这样您就不必在每次需要X或Y时都继续调用这些方法。
这有三个好处:
答案 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的值,您将无法使用常量方法并拥有来调用上面显示的函数,以获得正确的值。)