2015-02-06 106 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。

不知道更多關於代碼示例,我只能猜測。