Tại sao lại thích ký tự đại diện cho loại phân biệt đối xử trong API Java (Re: Java hiệu quả)


8

Trong phần khái quát về Java hiệu quả của Bloch (trong đó có chương "miễn phí" dành cho tất cả: http://java.sun.com/docs/books/effective/generics.pdf ), ông nói:

Nếu một tham số loại chỉ xuất hiện một lần trong khai báo phương thức, thay thế nó bằng ký tự đại diện.

(Xem trang 31-33 của pdf đó)

Chữ ký trong câu hỏi là:

public static void swap(List<?> list, int i, int j)

đấu với

public static void swap(List<E> list, int i, int j)

Và sau đó tiến hành sử dụng chức năng "người trợ giúp" riêng tư tĩnh với tham số loại thực tế để thực hiện công việc. Chữ ký của hàm trợ giúp là CHÍNH XÁC của tùy chọn thứ hai.

Tại sao ký tự đại diện lại thích hợp hơn, vì bạn cần KHÔNG sử dụng ký tự đại diện để hoàn thành công việc? Tôi hiểu rằng trong trường hợp này vì anh ta sửa đổi Danh sách và bạn không thể thêm vào bộ sưu tập với ký tự đại diện không giới hạn, vậy tại sao lại sử dụng nó?

Câu trả lời:


5

Tại sao ký tự đại diện thích hợp hơn

Tôi tin Josh nói rõ:

Trong API công khai, [ký tự đại diện] tốt hơn vì đơn giản hơn.

Đó là, đối với người dùng API. Sự phức tạp thêm nhỏ trong việc thực hiện không thể nhìn thấy từ bên ngoài. Và vì việc triển khai chỉ được viết một lần, nhưng API có thể được sử dụng nhiều lần bởi nhiều người khác nhau, đơn giản hóa API với chi phí khiến việc triển khai phức tạp hơn một chút vẫn là một chiến thắng chung.

> tại sao sử dụng nó cả?

Ý bạn là, tại sao nó tốt hơn

public static void swap(List list, int i, int j)

? Bởi vì cái sau sẽ mất hoàn toàn tổng quát, cho phép trình biên dịch bỏ qua tất cả các loại kiểm tra chung chung và cho phép chúng tôi viết mã cẩu thả. Tôi nghĩ tốt hơn là sử dụng chữ ký loại chung ngay cả khi chúng là chung này, chỉ để duy trì thói quen.

Cập nhật phản ánh về bình luận dưới đây

Bạn đã quên khai báo tham số chung từ chữ ký thứ hai, chính xác nó phải là

public static <E> void swap(List<E> list, int i, int j)

Đó là, <E>xuất hiện hai lần, không có thêm lợi ích, so với <?>chỉ xuất hiện một lần trong chữ ký đầu tiên. Đây là lý do tại sao nó đơn giản hơn.


1
Không, tại sao trao đổi (Danh sách <?>, ...) thích hợp hơn để trao đổi (Danh sách <E>, ...). Tôi không biết tại sao nó đơn giản hơn, trong bất kỳ bối cảnh nào.
Michael Campbell

1
Đừng thực sự thấy lợi ích. Để người dùng sử dụng phương thức hoán đổi, một cuộc gọi đến phiên bản công khai tĩnh <E> void exchange (Danh sách <E> danh sách, int i, int j) hoặc trao đổi khoảng trống tĩnh công khai (Danh sách <?> List, int i, int j) sẽ lokk giống hệt nhau, cụ thể là hoán đổi (myList, 0, 1). Vì vậy, liệu <E> xuất hiện hai lần hay có ký tự đại diện thay vào đó không thực sự quan trọng đối với tôi. Có lẽ tôi đang thiếu một cái gì đó?
Sẽ

1
@ Sẽ, trước khi gọi, bạn (thường) đọc khai báo API. Phiên bản ký tự đại diện của khai báo là (đơn giản) cho bộ não của chúng ta để giải thích.
Péter Török

1
ok, vậy thực sự là về sự đơn giản hóa nhỏ bé này. cảm ơn.
Sẽ

2
Tôi phải đồng ý với @Will, việc đơn giản hóa quá nhỏ đến nỗi nó hầu như không đáng để thực hiện.
Andres F.
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.