复制/重复引用变量的重点是什么?

时间:2011-03-25 09:40:49

标签: java idioms

我刚刚看到以下代码:

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

我希望我在这里提出的第一个问题不是毫无意义和/或愚蠢的,而且你很乐意回答它!

(代码引自org.openqa.selenium.support.PageFactory;版权所有2007-2009 WebDriver提交者;版权所有2007-2009 Google Inc.。)

4 个答案:

答案 0 :(得分:5)

应用程序行为没有区别。但是,在以下情况下可能会使用此类模式:

  • 想要提供更适合此上下文的值的本地名称。这是driverRef vs driver,它没有带来任何价值,但在其他情况下可能
  • 希望将变量作为调试器的局部变量进行访问。调试器可能会以不同方式处理局部变量和类字段(例如,在显示其值时),但很难证明这种更改是永久性的。
  • 关心可读性。这里替换的表达式很简单 - 只是driver,但有时你会有一个更复杂的表达式,如果内联则会使行太长。

答案 1 :(得分:3)

在这种情况下,我没有看到任何意义。但我可以看到将变量声明为final的观点。所以这就足够了:

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

答案 2 :(得分:1)

我认为'final'关键字是您问题的答案。

final表示无法重新分配引用。

答案 3 :(得分:1)

如前所述,在您发布的代码中,确实没有意义。

创建变量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();
}