Как объявить финальную строку внутри конструктора с помощью оператора if? - PullRequest
4 голосов
/ 03 мая 2019

Я использовал для объявления финальной строки внутри конструктора.Теперь я хочу вставить оператор if, чтобы при необходимости объявить его по-другому.

Раньше я делал:

public Config(){
    final String path = "<path>";
    doSomething(path);
}

Теперь я пытаюсь

public Config(String mode){
    if (mode = "1") {
        final String path = "<path1>";
    } else {
        final String path = "<path2>";
    }
    doSomething(path);
}

К сожалению, путь не может быть найден сейчас (я не могу найти ошибку символа), и я действительно заблудился, когда мои исследования поняли это.Следующие работы, хотя, я просто не могу объяснить ... У меня должна быть глубокая мисс концепция о чем-то здесь.

public Config(String mode){
    final String path;
    if (mode = "1") {
        path = "<path1>";
    } else {
        path = "<path2>";
    }
    doSomething(path);
}

Можете ли вы объяснить мне, что здесь происходит, что я должен прочитать, чтобы получить это.

Ответы [ 3 ]

10 голосов
/ 03 мая 2019

Не могли бы вы объяснить, что здесь происходит,

Фрагмент 2: path объявлен в области действия оператора if.Он недоступен за пределами этого if.

Фрагмент 3: path, объявленный в области видимости конструктора.Он доступен в этом конструкторе.

что я должен прочитать, чтобы получить это.

Конечно, JLS: https://docs.oracle.com/javase/specs/jls/se12/html/jls-6.html#jls-6.3 Это довольно сложно, найтиправую часть, внимательно прочитайте и наберите

doSomething("1".equals(mode) ? "<path1>" : "<path2>");
3 голосов
/ 03 мая 2019

Область действия любой конечной переменной находится внутри ее блока кода.Это не видно за пределами этого блока.Посмотрите эту ветку, чтобы узнать, почему область действия final определяется следующим образом: Область действия конечной локальной переменной в java

1 голос
/ 03 мая 2019

Дело в том:

public Config(){
    final String path = "<path>";
    doSomething(path);
}

не имеет никакого смысла. doSomething() может не изменять объект String, который вы ему передаете.

Вся ваша идея использовать final, как это, просто ошибочна. Объекты String являются неизменяемыми, и этот метод получает ссылку на такой объект String. Так что даже если у вас есть

void doSomething(String whatever) {
  whatever = "in your face";
  ... 
}

Ваша ссылка path останется прежней после этого вызова.

С этой точки зрения, в первом примере вы могли бы (следует для удобства чтения) перейти к doSomething("<path>");

Кроме того, реальный ответ здесь таков: у вас, похоже, неправильные представления о правильном использовании последнего ключевого слова. Нет смысла объявлять переменную final, когда она используется только один раз, как в ваших примерах. Наличие локальной переменной final только предотвращает повторное присвоение этой переменной в пределах ее области действия. Вы только читаете переменную один раз, таким образом, использование final не добавляет ничего полезного в ваш код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...