2011-03-25 36 views
3

我看見以下碼複製/重複參考變量的要點是什麼?

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谷歌公司)

回答

5

有沒有在應用程序的行爲沒有什麼區別。然而,這樣的模式可能在以下情況下使用:

  • 想要提供更適合於本上下文的值的本地名稱。這裏是driverRef vs driver,它不會帶來任何價值,但在其他情況下,它可能會
  • 想要使變量可以作爲調試器的本地變量訪問。調試器可能會不同地處理局部變量和類字段(例如,當呈現它們的值時),但是很難證明這樣的改變需要關心可讀性。這裏替換的表達式很簡單 - 只是driver,但有時候會有更復雜的表達式,如果內聯,會使行太長。
3

在這種情況下,我沒有看到任何一點。但我可以看到有一點將變量聲明爲final。所以這就足夠了:

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

我認爲'最終'關鍵字是你的問題的答案。

最終意味着該參考不能被重新分配。

+0

... tarlog擊敗我與它有一個更好的答案。 ;) – tamarintech 2011-03-25 09:47:26

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