Какой смысл копировать / дублировать ссылочную переменную? - PullRequest
3 голосов
/ 25 марта 2011

Я только что увидел следующий код:

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 ]

5 голосов
/ 25 марта 2011

Нет различий в поведении приложения. Однако такой шаблон может быть использован, когда:

  • желая указать локальное имя значения, которое лучше подходит в этом контексте. Здесь это driverRef против driver, которое не имеет никакого значения, но в других случаях это может
  • желая сделать переменную доступной в качестве локальной переменной для отладчика. Отладчики могут по-разному относиться к локальным переменным и полям классов (например, при представлении их значений), но трудно оправдать такое изменение, которое будет сделано постоянно
  • забота о читаемости. Здесь замененное выражение простое - просто driver, но иногда у вас есть более сложное выражение, которое сделало бы строку слишком длинной, если было бы встроено.
3 голосов
/ 25 марта 2011

В этом случае я не вижу никакого смысла. Но я вижу смысл объявить переменную как окончательную. Так что этого будет достаточно:

public static void initElements(final WebDriver driver, Object page) {
    initElements(new DefaultElementLocatorFactory(driver), page);
}
1 голос
/ 25 марта 2011

Как уже говорилось, в размещенном вами коде нет никакого смысла.

Одна из причин создания переменной 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();
}
1 голос
/ 25 марта 2011

Я думаю, что ключевое слово 'final' является ответом на ваш вопрос.

final означает, что ссылка не может быть переназначена.

...