2011-12-09 27 views
18

A Stringis-aCharSequence. Nhiều phương thức trong thư viện Java chấp nhận CharSequence để they operate more generally. Một số classe có phương pháp String (ví dụ: Writer.write(String)) và cũng thực hiện Appendable với phương thức tương đương CharSequence (ví dụ: Writer.append(CharSequence)).Chọn giữa CharSequence và Chuỗi cho một API

Nếu tôi đang viết một lớp đại biểu cho một lớp như vậy và cần một số kiểu nhập văn bản, tôi có thể chọn cho đầu vào đó là String hoặc CharSequence. Việc chọn sau sẽ giúp lớp học linh hoạt hơn, bằng cách cung cấp cho khách hàng nhiều tùy chọn hơn. Nhưng tôi không thấy nhiều mã thực hiện như vậy: các đối số văn bản gần như không đổi là String thay vì một số CharSequence. Có mặt hạn chế để sử dụng CharSequence không? Có một hit hiệu suất? Hoặc là nó chỉ là lập trình intertia hoặc sự thiếu hiểu biết gây ra việc sử dụng String thay vì CharSequence?

Hãy so sánh

class XMLWriter { 
    private final Writer writer; 

    // more stuff here 

    public void writeComment(String text) { 
     writer.write("<!-- "); 
     writer.write(text); 
     writer.write(" -->"); 
    } 
} 

với

class XMLWriter { 
    private final Writer writer; 

    // more stuff here 

    public void writeComment(CharSequence text) { 
     writer.write("<!-- "); 
     writer.append(text); 
     writer.write(" -->"); 
    } 
} 
+0

Logic của bạn có ý nghĩa với tôi. Bằng cách sử dụng CharSequence bạn sẽ cho phép mã gọi để cung cấp một StringBuffer/StringBuilder mà không cần gọi toString() trên nó - điều này xảy ra rất nhiều. – Andy

+0

@Andy vâng, tôi đã có 'StringBuilder' trong đầu khi tôi viết câu hỏi. – Raedwald

+0

Xem câu hỏi sau này trùng lặp, [Khi nào sử dụng CharSequence trong API] (http://stackoverflow.com/q/13234584/642706). –

Trả lời

13

Theo javadoc của CharSequence

Giao diện này không tinh chỉnh các hợp đồng chung của equals và hashCode phương pháp. Kết quả của việc so sánh hai đối tượng thực hiện CharSequence do đó, nói chung, không xác định. Mỗi đối tượng có thể là được thực hiện bởi một lớp khác và không đảm bảo rằng mỗi lớp sẽ có khả năng kiểm tra các trường hợp của nó đối với sự bình đẳng với các số của đối tượng kia. Do đó, không phù hợp để sử dụng các trường hợp Char1equence tùy ý làm các phần tử trong một tập hợp hoặc như các phím trong bản đồ.

Do đó IMO Chúng ta phải suy nghĩ kỹ trước khi sử dụng CharSequnce làm thay thế cho Chuỗi.

+0

Bạn có thể nói rằng các phương thức chỉ xuất văn bản, chẳng hạn như ví dụ của tôi, nên sử dụng 'CharSequence' thay vì' String'? – Raedwald