2011-07-05 27 views
8

Tôi muốn thiết kế lớp A thực hiện giao diện C và giảm khả năng hiển thị của một phương thức (được khai báo trong C) để đảm bảo nó an toàn từ thế giới bên ngoài, làm cho một trong các phương thức trong giao diện được triển khai trong lớp A là tư nhân (giảm khả năng hiển thị trong lớp A). Tôi phải làm điều này vì lý do an ninh, làm thế nào tôi có thể làm điều này, là có một workaround. Chúng tôi biết rằng theo mặc định, giao diện có các thành viên công khai. Nhưng không có lựa chọn nào cho tôi, ai đó có thể giúp tôi. Cảm ơn trước.Giảm khả năng hiển thị khi triển khai giao diện trong Java

- Vì vậy, không có cách nào, để có phương thức triển khai lớp từ giao diện và đặt ở chế độ riêng tư. Và tất cả các lớp thực hiện bất kỳ phương thức nào của giao diện sẽ luôn có phương pháp công khai?

Trả lời

13

Không, bạn không thể giảm khả năng hiển thị của phương thức trong giao diện. Điều gì sẽ xảy ra nếu ai đó đã viết:

C foo = new A(); 
foo.methodDeclaredPrivateInA(); 

? Theo như trình biên dịch có liên quan, mọi thứ có liên quan đến việc thực thi C đều có quyền gọi bất kỳ phương thức nào bên trong nó - đó là nguyên tắc thay thế của Liskov.

Nếu bạn không muốn triển khai toàn bộ giao diện công khai, không triển khai giao diện đó - hoặc ném ngoại lệ nếu bạn hoàn toàn phải thực hiện.

Điều đáng lưu ý là khả năng truy cập được cung cấp trong mã nguồn hiếm khi là biện pháp bảo mật tốt tốt. Nếu lớp của bạn đang chạy trong một máy ảo mà lần lượt nhận được để xác định quyền riêng của mình, bất cứ ai cũng có thể làm cho các thành viên có thể nhìn thấy thông qua phản ánh.

+0

Vì vậy, không có cách nào, để có phương thức triển khai lớp từ giao diện và đặt ở chế độ riêng tư. Và tất cả các lớp thực hiện bất kỳ phương thức nào của giao diện sẽ luôn có phương pháp công khai? –

+0

@ user357349: Có. Đó là cách nó được thiết kế. –

2

Bạn không thể giảm khả năng hiển thị của phương thức của giao diện trong Java. Bạn có thể chấp nhận phương pháp này bằng cách ném một số java.lang.UnsupportedOperationException không?

0

Bạn không thể giảm năng hiển thị vì bạn có thể viết một cái gì đó dọc theo dòng của

C newC = new A(); 
0

Cách tiếp cận này làm việc cho tôi. Bất kỳ chức năng mới nào được thêm vào PrivateInterface sẽ bị ngắt vẫn ngắt PublicSampleClass

private interface PrivateInterface { 
    void fooBar(); 
} 

public class PublicSampleClass { 

    private final listenerInterface = new PrivateInterface { 
     public void fooBar() { 
      PublicSampleClass.this.fooBar(); 
     } 
    }; 

    protected void fooBar() { 
     // Non public implementation 
    } 

} 
Các vấn đề liên quan