Mức truy cập gói riêng tư hạn chế hơn protected
: các thuộc tính và phương pháp được bảo vệ vẫn có thể được truy cập bằng cách chỉ phân lớp con một lớp. Được bảo vệ thành viên (hoặc có thể) dành cho kế thừa trong khi các thành viên riêng tư của gói thì không.
Thành viên riêng tư gói thường được sử dụng để các lớp đa cấp bên trong một gói có thể truy cập các thuộc tính hoặc phương thức (tiện ích) cụ thể triển khai.
ví dụ tốt cho điều này là những nhà xây dựng gói-tin của String
và mảng StringBuilder.value
char:
/*
* Package private constructor which shares value array for speed.
* this constructor is always expected to be called with share==true.
* a separate constructor is needed because we already have a public
* String(char[]) constructor that makes a copy of the given char[].
*/
String(char[] value, boolean share) {
// assert share : "unshared not supported";
this.value = value;
}
Vì vậy, lớp bên trong gói java.lang
hiệu quả có thể tạo mới Strings
nếu nội dung đã có mặt trong một char[]
không xâm phạm an ninh. Bạn không thể làm điều này từ ứng dụng của bạn bởi vì nếu bạn có thể, bạn sẽ có quyền truy cập (tham chiếu) vào mảng char nội bộ của một String
không thay đổi (phản ánh không được tính!).
Trong StringBuilder
(hay đúng hơn là AbstractStringBuilder
nơi thực hiện xuất phát từ) mảng char giữ giá trị hiện tại char[] value
và một phương pháp accessor để char[] getValue()
này cũng gói tin phương pháp hữu ích để hình String
như contentEquals(StringBuffer sb)
và contentEquals(CharSequence cs)
có thể sử dụng điều này cho hiệu quả và so sánh nhanh hơn mà không để lộ mảng char bên trong với "thế giới".
Tôi có thể thấy lý do tại sao một người nào đó có thể đã nói rằng - trình sửa đổi 'protected' giống như' gói riêng tư' ngoại trừ các lớp con cũng được mời tham gia vào nhóm. Nhưng nó sẽ là sai lầm để tạo ra một mối quan hệ lớp con (chỉ dành cho mục đích truy cập) nếu một người không tồn tại một cách tự nhiên. Nó thường sẽ không có ý nghĩa gì cho ví dụ lớp 'EmailSender' là lớp con của lớp' DomainObjectFilter' hoặc ngược lại. Trong tình huống này, phương pháp này thường được tạo thành 'công khai' (có lẽ với một bình luận nói rằng nó không * khái niệm * công khai ...). –
"đổ tất cả các lớp cho một mô-đun nhất định vào chính xác cùng một gói - khó sử dụng" - Đúng, nhưng tôi đã sử dụng phương pháp này ngay cả trong các trường hợp không tầm thường, như 20-30 lớp trong gói. Bất cứ điều gì lớn hơn, tất nhiên, là cần tái cấu trúc. –
Bạn không thể tổ chức các tệp nguồn của bạn thành một hệ thống phân cấp thư mục, và sau đó trong quá trình xây dựng, đổ tất cả chúng vào cùng một thư mục/gói trước khi biên dịch? Điều đó sẽ cung cấp cho bạn cơ cấu tổ chức và lợi ích của quyền truy cập gói riêng tư, đúng không? – jrahhali