While looking through the Selenium source code I noticed the following in the PageFactory:
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);
}
What is the benefit of having the following line?
final WebDriver driverRef = driver;
Wouldn’t it have made sense to just make the parameter final, and then passing that along to the next method without declaring the new reference?
Well, the answer is that setting
finalon a variable and only use it as an argument to a function is completely useless. In theDefaultElementLocatorFactoryconstructor, the variable related to the input argument can be freely reassigned, since it is a copy of the original reference.P.S. … unless of course, as suggested by the OP, the input argument is instead declared
final.