Има малко предимство да зададете параметър на Java метод като окончателен, тъй като не спира някой да промени състоянието на препратката към параметъра в рамките на метода. Всичко, което предотвратява, е повторното присвояване на променливата на параметъра към нещо друго, което не прави нищо с оригиналната препратка, и позволява използването на параметъра в анонимни вътрешни класове. Ако искате истинска безопасност в тази ситуация, ще се стремите да направите вашите типове параметри неизменни, ако е възможно.
Редактиране
Вие сте публикували:
public void setObject(Object o){
o++; // this does not compile
this.o=o;
}
Което смесва примитивен цифров и референтен тип. Има смисъл само ако o е Integer или друг числов обвиващ клас и дори така, превръщането му в окончателен няма да попречи на някой да създаде:
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";
}
Ето къде идва опасността и къде финалът не помага. Да кажем, че имате клас, наречен Име:
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, с поле за име и сетер. Това е опасен код:
class Foo {
private Name name;
public void setName(final Name name) {
name.setFirstName("Carlos");
this.name = name;
}
}
Тъй като не само променя състоянието на полето, то променя състоянието на препратката за име в извикващия код и модификаторът final няма да помогне ни най-малко. Решението: направете името неизменно.
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