2013-07-31 29 views

Trả lời

10

Truy cập các thành viên riêng tư từ một lớp khác hơi phức tạp hơn vì JVM không thực sự cho phép điều này. Kết quả là trình biên dịch tiêm các phương thức accessor mà làm cho nó hơi chậm hơn hoặc theo dõi stack của bạn phức tạp hơn.

Vì những lý do này, tôi để nó làm gói địa phương.

BTW Nhà xây dựng của abstract class cũng không cần phải là public. Nó cũng có thể là protected hoặc gói địa phương

private static class A { 
    private A() { 
     throw new Error(); 
    } 
} 
public static void main(String... ignored) { 
    new A(); 
} 

in thêm phần tử theo dõi ngăn xếp.

Exception in thread "main" java.lang.Error 
    at Main$A.<init>(Main.java:8) 
    at Main$A.<init>(Main.java:6) 
    at Main.main(Main.java:12) 

Làm cho gói trình xây dựng địa phương và gói thứ hai biến mất.

+0

Tại sao đường thừa của ngăn xếp ngăn xếp được tạo ra? Làm thế nào nó hoạt động? Tôi recongnized rằng dòng phụ xảy ra chỉ khi tôi xác định nó riêng tư. Chỉ được bảo vệ hai dòng. Vì vậy, nó có nghĩa là xác định tư nhân giảm hiệu quả? Tại sao trình biên dịch JVM cho phép xác định hàm tạo của các lớp như vậy với khả năng hiển thị> = được bảo vệ? –

+1

@ ŁukaszRzeszotarski JVM không cho phép truy cập riêng tư từ một lớp khác. Những gì javac làm để làm việc xung quanh điều này là tạo ra các phương thức tổng hợp mà không phải là private mà có thể được gọi. Chúng nhận được một số dòng của sự khởi đầu của lớp. Phương thức được tạo ra gọi phương thức thực. Nó làm điều này cho tất cả các thành viên tư nhân. Trong khi chậm hơn trong chế độ giải nghĩa, một khi tối ưu hóa phương thức bổ sung được gạch chân và không có tác động AFAIK ngoại trừ trên các hệ thống JME, nơi nó không đủ thông minh để làm điều này. –

+0

Bây giờ nó rõ ràng. Tôi thấy bytecode của lớp và điều thực sự làm tôi ngạc nhiên là bytecode chỉ chứa phương thức bổ sung nếu bạn cố gắng khởi tạo lớp (ví dụ trong phương thức chính). –

9

Theo như các lớp khác có liên quan, không nên vì lớp bên trong được khai báo là riêng tư. Họ không thể nhìn thấy nó cả.

Không nên tạo sự khác biệt với lớp bao ngoài vì nó chứa lớp bên trong.

+2

Chỉ cần lưu ý, nếu hàm tạo lớp của bạn được đánh dấu là 'riêng tư', một số công cụ để mã hóa xác minh tiêu chuẩn như [checkstyle] (http://checkstyle.sourceforge.net/) có thể đề xuất đánh dấu lớp là 'final' cũng. –