Я уже не раз встречал, но только вот подумал... А что означает такая конструкция, когда допустим в методе один из параметров имеет модификатор доступа final...
Ведь в любом случае при повторном вызове метода ему можно передать новое значение...
Я уже не раз встречал, но только вот подумал... А что означает такая конструкция, когда допустим в методе один из параметров имеет модификатор доступа final...
Ведь в любом случае при повторном вызове метода ему можно передать новое значение...
Если указан параметр final когда объявляется переменная, то его нельзя будет изменить.
public void i1(final String i1) {
i1 = ""; // ошибка компиляции
}
Также параметр final даёт к себе доступ анонимным классам. Знаю такой пример на Android при запуске Activity:
@Override
protected void onCreate(final Bundle i1) {
super.onCreate(i1);
setContentView(R.layout.layout_i1);
new AlertDialog.Builder(this)
.setTitle(getString(R.string.app_name))
.setPositiveButton("ОК", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface i2, int i3) {
i1.clone(); // вот тут можем его получить Только потому, что у Bundle i1 указан параметр final
return;
}
})
.setNegativeButton("Выход", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface i1, int i2) {
i1.cancel();
finish();
return;
}
})
.create()
.show();
}
Ведь если заменить эту строку
protected void onCreate(final Bundle i1) {
на это
protected void onCreate(Bundle i1) {
то вот здесь
@Override
public void onClick(DialogInterface i2, int i3) {
i1.clone(); <<<--------- в этой строке
return;
}
будет ошибка компиляции.
Если у параметра в методе нет модификатора final, то переменную можно будет подменить другим объектом. Например:
void f(String x){
x = "New";
System.out.println(x); //"New"
}
Модификатор final у параметра исключает эту возможность
void f(final String x){
x = "New"; // ошибка компиляции
}
В прототипе метода, аргументы которые имеют модификатор final, нельзя переопределить в теле метода. А вообще, модификатор final, подсказывает компилятору, чтобы он сразу знал, что переменная, метод или класс - только для чтения. Переменные final не инициализируются по умолчанию, им необходимо явно присвоить значение при объявлении или в конструкторе, иначе – ошибка компиляции.
Это нужно для уверенности, что во время выполнения метода нигде не было переопределенно значение аргумента , например.
public static String method(final String city) {
city = "Moscow"; //ошибка
return city;
}
На пример что бы можно было сделать так:
void method(final int i) {
mMember.setListener(new Listener() {
public void call() {
System.out.println(i);
}
});
}