2015-02-06 18 views
7

Mentre passa attraverso il codice libgdx sorgente per un Stage, ho incontrato questo segmento:Java riferimento locale su istanza variabile

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.)

Quello che mi interessava era questa linea: Batch batch = this.batch;

La mia prima ipotesi è stata un miglioramento della memorizzazione nella cache. Ho ragione, o c'è un altro motivo per evitare di utilizzare direttamente la variabile di istanza?

+0

Sei uscito con un debugger? A supposizione, forse qualcosa nel corpo se ricorre (e modifica il riferimento di esempio 'lotto'). –

+0

Vedere anche ["evitare l'opcode getfield"] (http://stackoverflow.com/questions/4761681/avoiding-getfield-opcode). – Radiodef

+0

Buoni pensieri, ma il riferimento di istanza batch non viene modificato tra i blocchi 'begin()' e 'end()' e questo metodo di disegno non è ricorsivo. – EntangledLoops

risposta

3

Nei primi giorni di Java, questo era imho sometimes used as an optimization, per evitare l'accesso a una variabile membro. Tuttavia oggigiorno credo che Hotspot possa ottimizzare meglio di noi umani.

Tuttavia, in questo contesto potrebbe essere utilizzato per prevenire problemi in caso di modifica simultanea di tale variabile, dal momento che è necessario chiamare begin() e end() nella stessa istanza.

+0

Concordo sul fatto che si tratti di ottimizzazione sottile. 'this.batch' è definitivo quindi è l'unica ragione plausibile. Anche Java SE ha cose simili. – Radiodef

0

Questo è un bit interessante di codice.

Una possibilità sarebbe quella di garantire che ciascuna delle chiamate ai metodi batch siano sullo stesso oggetto. Se qualche altro codice modifica this.batch su un altro thread, un possibile risultato sarebbe per alcune delle chiamate di metodo a un'istanza di un oggetto Batch mentre il resto delle chiamate passa a un'altra istanza di un oggetto Batch.

Un'altra possibilità è che alcuni programmatori trasportino idee e stili da altre lingue (in questo caso una lingua in cui è necessario utilizzare un identificatore come "self" per accedere all'istanza corrente) e in questo caso potrebbero aver provato per evitare di digitare this.batch ripetutamente.

Non sapendo più del codice di esempio, posso solo fare supposizioni.

Problemi correlati