Chuỗi là immutable class có nghĩa là nếu bạn không thể sửa đổi trạng thái của nó sau khi bạn tạo. Nếu bạn có thể sửa đổi một chuỗi sau khi nó đã nhập một thư viện khác, hoặc một bản đồ ví dụ kết quả sẽ là không thể đoán trước.
Một lỗi của API Java là BigInteger
và BigDecimal
không phải là cuối cùng có nghĩa là bạn cần thực hiện bản sao phòng thủ của các đối tượng này khi nhận chúng từ mã không đáng tin cậy. Ngược lại, bạn luôn có thể tin tưởng rằng String
sẽ vẫn nhất quán.
không đáng tin cậy BigInteger:
public class DestructiveBigInteger extends BigInteger {
public DestructiveBigInteger(String value) {
super(value);
}
public BigInteger add(BigInteger val) {
return BigInteger.ONE; // add() method does not behave correctly
}
public BigInteger subtract(BigInteger val) {
throw new UnsupportedOperationException("subtract is broken");
}
}
Điều tương tự cũng là không thể với String
. Như đã nêu trong Effective Java, bạn cần phải thực hiện các bản sao phòng thủ của các loại đối tượng:
public void setValue(BigInteger value) {
this.value = new BigInteger(value.toByteArray());
}
Tôi nhận ra có các lớp khác như số học được niêm phong cuối cùng. Chúng tôi có thể bắt đầu bằng cách phân tích chuỗi đầu tiên nhưng nhận xét của bạn không cần phải bị hạn chế đối với Chuỗi. –
+1 ... Tôi cũng muốn một lần trong cuộc sống của mình để mở rộng lớp String, mặc dù tôi không nhớ tại sao –
Như bạn đã đề cập java (tag), điều này đã được hỏi trước: http://stackoverflow.com/questions/2068804/why-is-string-final-in-java –