2015-02-06 74 views
7

虽然经历了Stagelibgdx源代码中的本地参考,我遇到了这个段:的Java在实例变量

public void draw() { 
    Camera camera = viewport.getCamera(); 
    camera.update(); 

    if (!root.isVisible()) return; 

    Batch batch = this.batch; 
    if (batch != null) { 
     batch.setProjectionMatrix(camera.combined); 
     batch.begin(); 
     root.draw(batch, 1); 
     batch.end(); 
    } 

    if (debug) drawDebug(); 
} 

Link on GitHub。)

我的是什么兴趣这一行:Batch batch = this.batch;

我的第一个猜测是一些缓存改进。我是对的,还是有其他原因避免直接使用实例变量?

+0

你是否已经开始使用调试器?猜测,也许在身体递归(并修改实例'批次'参考)的东西。 – 2015-02-06 02:10:25

+0

另请参见[“避免getfield操作码”](http://stackoverflow.com/questions/4761681/avoiding-getfield-opcode)。 – Radiodef 2015-02-06 02:59:58

+0

好的想法,但批处理实例引用在'begin()'和'end()'块之间没有改变,并且这种绘制方法不是递归的。 – EntangledLoops 2015-02-06 03:16:16

回答

3

在Java早期,这是imho sometimes used as an optimization,以避免访问成员变量。但是现在我相信,热点可以优于人类。

但是,在这种情况下,它可能用于防止在同时修改该变量的情况下出现问题,因为可能需要在同一实例上调用begin()end()

+0

我同意这看起来像微妙的优化。 'this.batch'是最终的,所以这是唯一合理的原因。 Java SE也有类似的东西。 – Radiodef 2015-02-06 02:56:04

0

这是一段有趣的代码。

一种可能性是确保批处理方法的每个调用都是针对同一个对象的。如果其他代码在另一个线程上修改this.batch,则一个可能的结果是,某些方法调用将成为Batch对象的一个​​实例,而其余的调用将转到另一个Batch对象实例。

另一种可能性是某些程序员从其他语言(在这种情况下,您必须使用标识符,如“self”来访问当前实例)中传递想法和样式,在这种情况下,他们可能一直在尝试以避免重复键入this.batch。

不知道更多关于代码示例,我只能猜测。