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.)

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

  • 希望提供更适合此上下文的值的本地名称。这里是
    driverRef
    vs
    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给了我一个更好的答案