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 final
on a variable and only use it as an argument to a function is completely useless. In the DefaultElementLocatorFactory
constructor, 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
.
The best thing I can come up with (under the assumption that the selene devs have more than a basic understanding of how java works - which I think is given):
Presumably before there was a DefaultElementLocatorFactory
class, the method used an anonymous inner function and when the code was refactored some parts were just overlooked.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With