2012-02-06 23 views
46

Tôi đã đọc một số mã nguồn từ các thư viện Java, và tôi bối rối ở đây;Java: Giao diện với từ khóa mới như thế nào là có thể?

Mã này là từ thư viện Document.java trong thư viện jaxb và ContentVisitor là Giao diện trong cùng một gói, cách chúng tôi có thể tạo một phiên bản Giao diện bằng từ khóa mới? không phải là bất hợp pháp?

public final class Document { 
. 
. 
private final ContentVisitor visitor = new ContentVisitor() { 
    public void onStartDocument() { 

     throw new IllegalStateException(); 
    } 

    public void onEndDocument() { 
     out.endDocument(); 
    } 

    public void onEndTag() { 
     out.endTag(); 
     inscopeNamespace.popContext(); 
     activeNamespaces = null; 
    } 
} 
+19

Bạn vừa phát hiện ra, có lẽ, một trong những tính năng mạnh mẽ nhất của Ngôn ngữ lập trình Java. – Mersenne

Trả lời

46

Trong mã, bạn không tạo phiên bản giao diện. Thay vào đó, mã định nghĩa một lớp ẩn danh thực hiện giao diện và khởi tạo lớp đó.

Mã này tương đương với:

public final class Document { 

    private final class AnonymousContentVisitor implements ContentVisitor { 

     public void onStartDocument() { 
      throw new IllegalStateException(); 
     } 

     public void onEndDocument() { 
      out.endDocument(); 
     } 

     public void onEndTag() { 
      out.endTag(); 
      inscopeNamespace.popContext(); 
      activeNamespaces = null; 
     } 
    } 

    private final ContentVisitor visitor = new AnonymousContentVisitor(); 
} 
+0

cảm ơn cú pháp này (lớp ẩn danh) chỉ tiết kiệm cho chúng ta từ việc viết một số mã bổ sung hoặc nó có lợi thế hay sử dụng khác? –

+0

Nó tiết kiệm phải viết thêm mã và đưa ra một cái tên. Tên có nhiều khả năng là 'Tài liệu $ 1' trong ví dụ trên. –

+1

@DesignCode: Nó chủ yếu là cú pháp đường, nhưng cũng có điểm bán hàng độc đáo. Ví dụ, nếu một lớp như vậy được định nghĩa bên trong một hàm, nó có thể truy cập các biến 'final' được định nghĩa bên trong hàm. – NPE

0

Tuyên bố đó thực sự tạo một lớp ẩn danh mới, thực hiện giao diện ContentVisitor và sau đó là thể hiện của nó cho phạm vi nhất định và hoàn toàn hợp lệ.

0

Do thông báo nơi niềng răng mở - bạn đang khai báo một đối tượng bên trong (gọi là anonymous class) mà thực hiện ContentVisitor và tất cả các phương pháp cần thiết ngay tại chỗ!

0

Đó là thực hiện giao diện nội tuyến. Ý tưởng là để trình biên dịch tạo ra một lớp ẩn danh thực hiện giao diện. Sau đó, đối với mỗi phương thức được xác định trong giao diện, bạn có thể (tùy chọn) cung cấp một phương thức có chữ ký phù hợp sẽ được sử dụng như việc thực hiện phương thức của giao diện.

Đây là cú pháp Oxygene mới, được thêm vào ngôn ngữ để cho phép các lập trình viên của Oxygene làm việc với các sự kiện dựa trên giao diện này giống như cách các lập trình viên Java làm.

10

Hợp lệ. Nó được gọi là lớp ẩn danh. See here

Chúng tôi đã xem các ví dụ về cú pháp để xác định và khởi tạo lớp ẩn danh. Chúng tôi có thể bày tỏ cú pháp mà chính thức hơn như:

new class-name ([ argument-list ]) { class-body } 

hay:

new interface-name() { class-body } 
+0

+1 liên kết đẹp tnx –

0

Bạn thực sự có chỉ cung cấp việc thực hiện của giao diện này một cách nặc danh. Điều này khá phổ biến và tất nhiên là có thể. Hãy xem here để biết thêm thông tin.

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