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();
}
我感兴趣的是这一行:Batch batch = this.batch;
我的第一个猜测是一些缓存改进。我是对的,还是有其他原因避免直接使用实例变量?
这是一段有趣的代码。
一种可能性是确保对批处理方法的每次调用都针对同一个对象。如果其他一些代码在另一个线程上修改 this.batch,一个可能的结果是某些方法调用是针对 Batch 对象的一个实例,而其余调用是针对 Batch 对象的另一个实例。
另一种可能性是一些程序员继承了其他语言的想法和风格(在这种情况下,您必须使用诸如 "self" 之类的标识符来访问当前实例的语言),在这种情况下,他们可能一直在努力避免重复输入 this.batch。
对代码示例了解不多,只能猜测。
在早期 Java 天,这是恕我直言 sometimes used as an optimization,以避免访问成员变量。但是现在我相信,Hotspot 比我们人类优化得更好。
但是,在这种情况下,它可能用于防止在同时修改该变量的情况下出现问题,因为可能需要在同一实例上调用 begin()
和 end()
。
在浏览 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();
}
我感兴趣的是这一行:Batch batch = this.batch;
我的第一个猜测是一些缓存改进。我是对的,还是有其他原因避免直接使用实例变量?
这是一段有趣的代码。
一种可能性是确保对批处理方法的每次调用都针对同一个对象。如果其他一些代码在另一个线程上修改 this.batch,一个可能的结果是某些方法调用是针对 Batch 对象的一个实例,而其余调用是针对 Batch 对象的另一个实例。
另一种可能性是一些程序员继承了其他语言的想法和风格(在这种情况下,您必须使用诸如 "self" 之类的标识符来访问当前实例的语言),在这种情况下,他们可能一直在努力避免重复输入 this.batch。
对代码示例了解不多,只能猜测。
在早期 Java 天,这是恕我直言 sometimes used as an optimization,以避免访问成员变量。但是现在我相信,Hotspot 比我们人类优化得更好。
但是,在这种情况下,它可能用于防止在同时修改该变量的情况下出现问题,因为可能需要在同一实例上调用 begin()
和 end()
。