Sự khác biệt giữa StringBuilder
và StringBuffer
trong Java cũng được ghi lại và cũng là touched upon in StackOverflow.Tại sao không có StringBuilder và StringBuffer thực hiện một giao diện chung?
Về cơ bản, StringBuilder
là bản sao không được đồng bộ hóa StringBuffer
, với khá nhiều giao diện tương tự vì nó được dự định là thay thế thả nhanh hơn cho StringBuffer
. API của chúng thực tế giống hệt nhau và chúng thực sự là các lớp con của cùng lớp không thể truy cập được lớp trừu tượng trong JDK hiện tại.
Điều mà tôi tự hỏi, đó là lý do tại sao chúng không phải là liên quan đến công khai. Có cả hai lớp thực hiện một giao diện chung hoặc thậm chí có StringBuffer
làm lớp con của StringBuilder
sẽ có ý nghĩa, cho phép sự tồn tại của mã được chia sẻ cho cả hai lớp.
Vậy tại sao sự tách biệt này bị buộc phải? Có phải vì vậy các lập trình viên sẽ không vô tình trộn chuỗi an toàn với mã không an toàn không? Hay đó chỉ là một sự giám sát thiết kế mà bây giờ sẽ được thừa hưởng vào cuối đời đời?
EDIT:
Để làm cho mọi việc rõ ràng: Tôi có thể suy đoán trên tại sao mọi thứ như thế này, nhưng tôi hy vọng để tham khảo cụ thể để quyết định thực tế, ví dụ trong quá trình JSR. Bất cứ điều gì có thể làm sáng tỏ điều gì, với tôi, là một tình huống thỉnh thoảng gây ra một số khó khăn.
EDIT 2:
Thực tế là cả hai lớp thực hiện Appendable
hoàn toàn quên khuấy đi. Có lẽ bởi vì giao diện cụ thể đó là vô ích cho hầu hết các mục đích - nó chỉ có thể nối thêm một ký tự đơn hoặc một đối tượng đã chuẩn bị và đó là nó. Trong hầu hết các trường hợp, nó không hữu ích hơn cả hai lớp là lớp con của Object
.
EDIT 3:
Vâng, đây là lý do cho chính xác câu hỏi này từ a semi-official source:
Đánh giá bởi nhóm thư viện:
Đó là do thiết kế mà StringBuffer và StringBuilder chia sẻ không phổ biến supertype công khai. Chúng không có ý định thay thế: một là một lỗi (StringBuffer) và cái kia (StringBuilder) là thay thế của nó.
Rõ ràng việc thiếu một siêu kiểu chung có thể, trong một số trường hợp, làm chậm việc di chuyển được hy vọng từ StringBuffer sang StringBuilder. Mặt lật là bằng cách thêm một kiểu siêu phổ biến, chúng tôi sẽ lấy các lỗi của trước đây và giữ chúng trong một giao diện công khai để ở bên chúng tôi trong tất cả thời gian . Điều này không chỉ làm chậm quá trình di chuyển: nó làm hỏng nó.
Có các phương pháp, ví dụ: nối thêm (dài) trong cả hai lớp nhưng không có giao diện nào. –
Mặc dù tôi nghĩ như thế nào Vector và ArrayList mở rộng AbstractList, StringBuffer và StringBuilder có thể đã mở rộng một lớp trừu tượng tương tự. Tôi đã không nhìn vào nguồn mới nhất, nhưng StringBuilder dường như là một rip-off thẳng của StringBuffer trừ đi việc đồng bộ hóa. –
@MatthewFlaschen append() là từ Phụ lục. –