Java 什么';复制/复制引用变量的点是什么?
我刚才看到了以下代码:Java 什么';复制/复制引用变量的点是什么?,java,idioms,Java,Idioms,我刚才看到了以下代码: public static void initElements(WebDriver driver, Object page) { final WebDriver driverRef = driver; initElements(new DefaultElementLocatorFactory(driverRef), page); } 有人能告诉我,写这篇文章而不是: public static void initElements(WebDriver dr
public static void initElements(WebDriver driver, Object page) {
final WebDriver driverRef = driver;
initElements(new DefaultElementLocatorFactory(driverRef), page);
}
有人能告诉我,写这篇文章而不是:
public static void initElements(WebDriver driver, Object page) {
initElements(new DefaultElementLocatorFactory(driver), page);
}
我希望我在这里的第一个问题不是太无意义和/或愚蠢,我很高兴回答它
(代码引用自;版权所有2007-2009 WebDriver committers;版权所有2007-2009 Google Inc.)应用程序行为没有区别。但是,在以下情况下,可使用该模式:
- 希望提供更适合此上下文的值的本地名称。这里是
vsdriverRef
,它不会带来任何价值,但在其他情况下可能会带来价值driver
- 希望使该变量作为调试器的局部变量可访问。调试器可能会以不同的方式处理局部变量和类字段(例如,在显示它们的值时),但很难证明这种更改是永久性的
- 关注可读性。这里替换的表达式很简单-只是
,但有时您有一个更复杂的表达式,如果内联的话,这会使行太长驱动程序
- 在这种情况下,我看不出有什么意义。但我可以看到将变量声明为final的一点。所以这就足够了:
public static void initElements(final WebDriver driver, Object page) {
initElements(new DefaultElementLocatorFactory(driver), page);
}
我认为“final”关键字就是你问题的答案
final意味着引用不能被重新分配。正如前面所说的,在您发布的代码中没有任何意义 创建变量
final
的一个原因是,您希望在方法内部的匿名内部类中使用它。变量必须是final
,才能在匿名内部类中访问。一个有点傻的例子,只是为了说明这一点:
public static void initElements(final WebDriver driver, final Object page) {
// Anonymous inner class
Runnable runnable = new Runnable() {
@Override
public void run() {
// The variables must be final, otherwise you can't access them here
initElements(new DefaultElementLocatorFactory(driver), page);
}
};
runnable.run();
}
... tarlog给了我一个更好的答案