Загрузите данные XML в пользовательский объект и сохраните их в таблицу

Остановить переназначение переменной

Хотя эти ответы интеллектуально интересны, я не прочел короткий простой ответ:

Используйте ключевое слово final , когда вы хотите, чтобы компилятор запретил перегруппировку переменной для другого объекта.

Является ли переменная статической переменной, переменной-членом, локальной переменной или аргументом / параметром

Пример

Давайте посмотрим на эффект в действии.

Рассмотрим этот простой метод, где две переменные ( arg и x ) оба могут быть повторно назначены разные объекты.

// Example use of this method: 
//   this.doSomething( "tiger" );
void doSomething( String arg ) {
  String x = arg;   // Both variables now point to the same String object.
  x = "elephant";   // This variable now points to a different String object.
  arg = "giraffe";  // Ditto. Now neither variable points to the original passed String.
}

Отметьте локальную переменную как final . Это приводит к ошибке компилятора.

void doSomething( String arg ) {
  final String x = arg;  // Mark variable as 'final'.
  x = "elephant";  // Compiler error: The final local variable x cannot be assigned. 
  arg = "giraffe";  
}

Вместо этого отметим параметрную переменную как final . Это также приводит к ошибке компилятора.

void doSomething( final String arg ) {  // Mark argument as 'final'.
  String x = arg;   
  x = "elephant"; 
  arg = "giraffe";  // Compiler error: The passed argument variable arg cannot be re-assigned to another object.
}

Мораль истории:

Если вы хотите, чтобы переменная всегда указывала на один и тот же объект, отметьте переменную final .

Никогда не переназначайте аргументы

Как хорошая практика программирования (на любом языке), вы должны никогда повторно назначить переменную параметра / аргумента объекту, отличному от объекта, переданного вызывающим методом. В приведенных выше примерах никогда не следует писать строку arg =. Поскольку люди делают ошибки, а программисты - люди, давайте попросим компилятор помочь нам. Пометьте каждую переменную параметра / аргумента как «final», чтобы компилятор мог найти и помечать любые такие перераспределения.

В Retrospect

Как отмечено в других ответах ... Учитывая оригинальный дизайн Java цель помочь программистам избежать немых ошибок, таких как чтение за концом массива, Java должен был быть разработан для автоматического принудительного применения всех переменных параметра / аргумента как «final». Другими словами, Аргументы не должны быть переменными . Но задним числом является 20/20 видение, и разработчики Java в свое время были в полной мере.

В дополнение к полноте

public class MyClass {
    private int x;
    //getters and setters
}

void doSomething( final MyClass arg ) {  // Mark argument as 'final'.

   arg =  new MyClass();  // Compiler error: The passed argument variable arg  cannot be re-assigned to another object.

   arg.setX(20); // allowed
  // We can re-assign properties of argument which is marked as final
 }
-1
задан sveer 24 February 2019 в 17:12
поделиться