Có chút lợi thế để đặt tham số phương thức Java là cuối cùng vì nó không ngăn ai đó thay đổi trạng thái tham chiếu tham số trong phương thức. Tất cả những gì nó ngăn cản là gán lại biến tham số cho một biến nào khác, nó không làm gì với tham chiếu ban đầu, và nó cho phép sử dụng tham số trong các lớp bên trong vô danh. Nếu bạn muốn an toàn thực sự trong tình huống này, bạn sẽ cố gắng làm cho các loại thông số của bạn trở nên bất biến nếu có thể.
Sửa
Bạn đã đăng:
public void setObject(Object o){
o++; // this does not compile
this.o=o;
}
nào trộn nguyên thủy số và tài liệu tham khảo loại. Nó chỉ có ý nghĩa nếu o là một Integer hoặc lớp wrapper số khác, và ngay cả như vậy, làm cho nó cuối cùng sẽ không tránh người khác tạo:
private void setI(final Integer i) {
this.i = 1 + i;
}
Nhưng không phải mã của bạn cũng không mã này trên sẽ ảnh hưởng đến các đối tượng tham số trên phía mã gọi.
Sửa
OK bây giờ bạn đã đăng:
public void setName(String name){
name="Carlos";
this.name=name;
}
Nhưng rồi ai đó có thể viết
public void setName(final String name){
this.name= name + " Carlos";
}
Đây là nơi nguy hiểm đến và nơi cuối cùng không giúp . Giả sử bạn có một lớp được gọi là Tên:
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;
}
}
Và sau đó là một lớp, Foo, với trường Tên và trình cài đặt.Đây là nguy hiểm mã:
class Foo {
private Name name;
public void setName(final Name name) {
name.setFirstName("Carlos");
this.name = name;
}
}
Bởi vì nó không chỉ thay đổi trạng thái của lĩnh vực này, nó thay đổi trạng thái của tài liệu tham khảo Tên trong mã gọi, và sửa đổi thức sẽ không giúp đỡ lẫn bit. Các giải pháp: làm cho Tên bất biến.
ví dụ
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());
}
}
Vì trong C++ bạn có thể gửi tham số như tham chiếu và con trỏ cho phép nhà phát triển thay đổi giá trị ban đầu, đôi khi do nhầm lẫn –
Apropos: http://stackoverflow.com/questions/4162531/making-java-method-arguments-as-final – jdv
Bởi vì Java là ** luôn luôn ** vượt qua bởi giá trị, sửa đổi các referene bên trong phương pháp được gọi là * về cơ bản * a no-op. Trong khi sửa đổi trạng thái thông qua tham chiếu sẽ hoạt động như trong C++. –