2012-06-11 8 views
6

mentre guardando attraverso il codice sorgente di selenio ho notato quanto segue nella PageFactory:ridichiarazione dei parametri

public static <T> T initElements(WebDriver driver, Class<T> pageClassToProxy) { 
    T page = instantiatePage(driver, pageClassToProxy); 
    initElements(driver, page); 
    return page; 
} 

public static void initElements(WebDriver driver, Object page) { 
    final WebDriver driverRef = driver; 
    initElements(new DefaultElementLocatorFactory(driverRef), page); 
} 

Qual è il vantaggio di avere la seguente riga?

final WebDriver driverRef = driver; 

Non sarebbe un senso di fare solo il parametro finale, e poi passando che insieme a quello successivo senza dichiarare il nuovo riferimento?

+3

Sì. Avrebbe avuto più senso. –

+1

Forse lo sviluppatore non era a conoscenza del modificatore 'final'? lolz – user1329572

+0

Mentre questo non risponde alla domanda, ho il sospetto che sarebbe stato compilato dal bytecode dal jvm come no-op. – corsiKa

risposta

3

Bene, la risposta è che l'impostazione final su una variabile e solo usarla come argomento per una funzione è completamente inutile. Nel costruttore DefaultElementLocatorFactory, la variabile relativa all'argomento di input può essere riassegnata liberamente, poiché è una copia del riferimento originale.

P.S. ... a meno che, ovviamente, come suggerito dall'OP, l'argomento di input sia invece dichiarato final.

+0

Devo precisare che mi sento piuttosto zoppo a fornire questa risposta, ma non vedo nient'altro da dire e qualcuno doveva, immagino ... –

2

La cosa migliore che posso venire con (partendo dal presupposto che gli sviluppatori Selene hanno più di una conoscenza di base di come funziona java - che credo è dato):

Presumibilmente prima che ci fosse una classe DefaultElementLocatorFactory, il metodo utilizzava una funzione interna anonima e quando il codice veniva refactored alcune parti erano semplicemente trascurate.

+0

Questo è il motivo per cui ho chiesto, volevo essere certo di non essere perdendo qualche bug o magia JVM che stava accadendo e che semplicemente non era stata commentata. – Scott

+0

@Scott In effetti finale o nessuna finale genererà esattamente lo stesso bytecode, tranne che il JLS consente l'inlining delle variabili finali in determinate situazioni. Questo è fondamentalmente il modo in cui le chiusure funzionano per le classi anonime, è stato prima aggiunto in modo che 'if (DEBUG) {]' possa essere ottimizzato e in generale è orribile trovare fonti di bug. Ma nessuno di questi si applica al tuo codice. – Voo

+0

Ho dato questo +1, ma non ho trovato alcuna prova per affermare che è stato utilizzato da una funzione interna anonima (ho guardato attraverso la cronologia dei commit sul codice di Google). Tuttavia, la mia ipotesi è che è una possibilità probabile. – Scott