2012-06-11 22 views
6

patrząc poprzez kod źródłowy Selen zauważyłem następujące w PageFactory:ponowna deklaracja parametrów

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); 
} 

Jakie są korzyści z posiadania następujący wiersz?

final WebDriver driverRef = driver; 

Czy nie ma sensu po prostu dokonać ostatecznego parametru, a następnie przekazać go do następnej metody bez deklarowania nowego odniesienia?

+3

Tak. To miałoby więcej sensu. –

+1

Może programista nie był świadomy modyfikatora 'final'? lolz – user1329572

+0

Chociaż to nie odpowiada na pytanie, bardzo podejrzewam, że byłby skompilowany z kodu bajtowego przez jvm jako no-op. – corsiKa

Odpowiedz

3

Cóż, odpowiedź brzmi, że ustawienie final na zmiennej i używać go jako argumentu do funkcji jest całkowicie bezużyteczne. W konstruktorze DefaultElementLocatorFactory zmienna związana z argumentem wejściowym może być dowolnie zmieniana, ponieważ jest kopią pierwotnego odwołania.

P.S. ... chyba że, jak sugeruje OP, argument wejściowy jest zamiast tego zadeklarowany jako final.

+0

Muszę wskazać, że czuję się dość kiepsko, podając tę ​​odpowiedź, ale nie widzę nic więcej do powiedzenia i ktoś musiał, tak sądzę ... –

2

Najlepszą rzeczą, jaką mogę wymyślić (przy założeniu, że deweloperów Selene mieć więcej niż podstawowego zrozumienia jak działa java - co moim zdaniem jest podany):

Przypuszczalnie przed istniała klasa DefaultElementLocatorFactory, metoda wykorzystywała anonimową funkcję wewnętrzną, a kiedy kod został refaktoryzowany, niektóre części zostały przeoczone.

+0

Oto dlaczego zapytałem, chciałem się upewnić, że nie jestem brakowało jakiegoś błędu JVM lub magii, która miała miejsce, a która po prostu nie została skomentowana. – Scott

+0

@Scott W rzeczywistości końcowy lub żaden końcowy wygeneruje dokładnie ten sam kod bajtowy, z tym wyjątkiem, że JLS zezwala na wstawianie końcowych zmiennych w określonych sytuacjach. Zasadniczo to, w jaki sposób zamykanie działa dla anonimowych klas, zostało dodane po raz pierwszy, aby 'if (DEBUG) {]' mogło zostać zoptymalizowane i generalnie jest okropne, aby znaleźć źródło błędów. Ale nic z tego nie odnosi się do twojego kodu. – Voo

+0

Dałem to +1, ale nie znalazłem dowodów na to, że zostało użyte przez anonimową funkcję wewnętrzną (przejrzałem historię commitów w kodzie Google). Jednak domyślam się, że jest to prawdopodobna możliwość. – Scott