Java 对实例变量的局部引用

Java Local reference over instance variable

在浏览 libgdx source code for a Stage 时,我遇到了这个片段:

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;

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

这是一段有趣的代码。

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

另一种可能性是一些程序员继承了其他语言的想法和风格(在这种情况下,您必须使用诸如 "self" 之类的标识符来访问当前实例的语言),在这种情况下,他们可能一直在努力避免重复输入 this.batch。

对代码示例了解不多,只能猜测。

在早期 Java 天,这是恕我直言 sometimes used as an optimization,以避免访问成员变量。但是现在我相信,Hotspot 比我们人类优化得更好。

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