Нет большого преимущества в том, чтобы установить параметр метода Java как окончательный, поскольку это не мешает кому-либо изменить состояние ссылки на параметр в методе. Все, что он предотвращает, — это повторное присвоение переменной параметра чему-то другому, что ничего не делает с исходной ссылкой, и позволяет использовать параметр в анонимных внутренних классах. Если бы вы хотели настоящей безопасности в этой ситуации, вы бы стремились сделать ваши типы параметров неизменяемыми, если это возможно.
Изменить
Вы опубликовали:
public void setObject(Object o){
o++; // this does not compile
this.o=o;
}
Который смешивает примитивный числовой и ссылочный тип. Это имеет смысл только в том случае, если o является целым или другим числовым классом-оболочкой, и даже в этом случае создание final не помешает кому-то создать:
private void setI(final Integer i) {
this.i = 1 + i;
}
Но ни ваш код, ни этот код выше не повлияют на объект параметра на стороне вызывающего кода.
Изменить
Итак, вы опубликовали:
public void setName(String name){
name="Carlos";
this.name=name;
}
Но тогда кто-то мог написать
public void setName(final String name){
this.name= name + " Carlos";
}
Вот где возникает опасность и где финал не помогает. Скажем, у вас есть класс с именем Name:
public class Name {
private String lastName;
private String firstName;
public Name(String lastName, String firstName) {
this.lastName = lastName;
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
}
А затем класс Foo с полем Name и сеттером. Это опасный код:
class Foo {
private Name name;
public void setName(final Name name) {
name.setFirstName("Carlos");
this.name = name;
}
}
Поскольку он меняет не только состояние поля, но и состояние ссылки Name в вызывающем коде, а модификатор final ни на йоту не поможет. Решение: сделать Name неизменяемым.
e.g.,
import java.util.Date;
// class should be declared final
public final class BetterName {
private String lastName;
private String firstName;
private Date dateOfBirth;
public BetterName(String lastName, String firstName, Date dob) {
this.lastName = lastName;
this.firstName = firstName;
// make and store a private copy of non-immutable reference types
dateOfBirth = new Date(dob.getTime());
}
// only getters -- no setters
public String getLastName() {
return lastName;
}
public String getFirstName() {
return firstName;
}
public Date getDateOfBirth() {
// return copies of non-immutable fields
return new Date(dateOfBirth.getTime());
}
}
person
Hovercraft Full Of Eels
schedule
28.06.2015
final
в Java не означает то же самое, чтоconst
в C++. - person Jesper   schedule 28.06.2015