Tại sao định nghĩa CharSequence không chứa (CharSequence)?


11

Điều này áp dụng cho cả Java SE & Android, vì các hợp đồng giống hệt nhau.

CharSequencekhông định nghĩa một contains(CharSequence)phương thức. Tôi dường như không thể tìm thấy lý do tại sao, và bao gồm nó sẽ khá hữu ích, ngăn chặn nhu cầu gọi CharSequence#toString()để kiểm tra một chuỗi các ký tự.

Ví dụ, trong Android, người dùng buộc phải gọi Editable#toString()để xem nếu nó chứa một chuỗi các ký tự, mặc dù Editabledụng cụ CharSequence, mà có thể tránh được nếu CharSequenceđịnh nghĩa contains(CharSequence).

Ý tưởng đằng sau sự lựa chọn thiết kế này là gì? Đây có phải là một giám sát tiềm năng, hoặc có một lý do thiết kế cho việc này?

Câu trả lời:


10

Mục đích của CharSequenceviệc cung cấp chế độ xem chỉ đọc cho chuỗi ký tự và đó là chế độ xem. Giao diện này không cung cấp bất kỳ phương thức thao tác hoặc tìm kiếm chuỗi nào. Những cái đó nằm ngoài phạm vi.

Nguyên tắc phân chia giao diện cho thấy rằng các máy khách thuộc loại không nên phụ thuộc vào các phương thức mà chúng không sử dụng. Do đó, một giao diện chỉ nên khai báo bộ hữu ích tối thiểu. Nếu một trường hợp sử dụng khác nhau cần các phương thức khác nhau, thì nên có một giao diện khác.

Một khách hàng chỉ cần một nguồn ký tự có thể không cần các phương thức tìm kiếm.

Tất nhiên có thể lạm dụng Nguyên tắc này và kết thúc với một nghìn giao diện nhỏ. Điều đó cũng không tốt. Vì vậy, CharSequencegiao diện không chỉ chứa tối thiểu charAt()length()phương thức, mà còn là phương thức tiện lợi liên quan sâu sắc subSequence(). (Một CharSequence có thể có khả năng cung cấp một khung nhìn vào một chuỗi con mà không cần sao chép chuỗi, đó là lý do tại sao đây phải là một phương thức thể hiện). Chỉ định toString()là OK vì phương thức đó sẽ được kế thừa từ Object. Các phương pháp chars()codePoints()thích ứng CharSequencevới một Streamgiao diện. Bởi vì đây là các phương thức mặc định, chúng không áp đặt các yêu cầu bổ sung cho các lớp thực hiện CharSequence.

Các CharSequenceloại rất hữu ích khi một phương pháp cần có một nguồn nhân vật chung chung mà không chỉ định một việc thực hiện cụ thể (ví dụ như chuỗi vs CharBuffer vs StringBuilder). Các phương thức String#join()String#contains()là những ví dụ tốt về việc sử dụng CharSequences.

Không cần thiết CharSequencephải cung cấp một contains()phương thức vì nó có thể được thực hiện bên ngoài. Mặc dù Java không có sự tiện lợi của các phương thức mở rộng của C #, nhưng một phương thức tĩnh về cơ bản là giống nhau. Vì vậy, thay vì boolean Editable#contains(CharSequence needle)bạn sẽ có một static boolean contains(CharSequence haystack, CharSequence needle). Các thuật toán tìm kiếm chuỗi là một chủ đề khoa học máy tính được nghiên cứu kỹ lưỡng. Các thuật toán khác nhau với sự đánh đổi khác nhau là có sẵn.

Đọc thêm:


2
Bạn đề cập đến " giao diện này không cung cấp bất kỳ thao tác chuỗi hoặc các phương pháp tìm kiếm. Đó là ra khỏi phạm vi. ", Nhưng containskhông phải là một phương pháp đột biến, và có không phương pháp tồn tại tìm kiếm ( charAt), vậy làm thế nào thực hiện điều này áp dụng ?. Ngoài ra, " Vì đây là các phương thức mặc định, nên chúng không áp đặt các yêu cầu bổ sung cho các lớp triển khai CharSequence. " - Không thể containsđược triển khai như một mặc định thông qua hàm return to String().contains(...), loại bỏ yêu cầu cho các lớp thực hiện?
Vince Emigh

1
@VinceEmigh Có, contains()có thể là một phương thức mặc định. Nếu nó tồn tại thì không nên thực hiện String#containstheo cách khác nhưng vòng khác: Chuỗi nên sử dụng triển khai CharSequence. Sự charAt()khác biệt Nó không thực hiện một thuật toán tìm kiếm, nó là một phần quan trọng của CharSequence: không có nó, nội dung không thể được sao chép thành một loại khác như thế nào String. Các luồng là một phần quan trọng của Java8 và việc thêm các phương thức mặc định này phù hợp với các bổ sung cho các giao diện khác như Collection.
amon
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.