2012-02-06 46 views
6

Tôi chưa bao giờ gặp phải điều gì đó như thế này và tôi không biết loại mã này! Đây là gì? (Tôi khá mới đối với Java)Kiểu gọi hàm dựng Java nào?

DefaultHandler handler = new DefaultHandler() { 

      boolean bfname = false; 
      boolean blname = false; 
      boolean bnname = false; 
      boolean bsalary = false; 

      public void startElement(String uri, String localName,String qName, 
        Attributes attributes) throws SAXException { 

       // code 

      } 

      public void endElement(String uri, String localName, 
        String qName) throws SAXException { 

       // code 

      } 

      public void characters(char ch[], int start, int length) throws SAXException { 

       // code 
     }; 

Sau khi hàm tạo gọi có dấu ngoặc ôm (!?) Và có vẻ như có một sự ghi đè của một số phương pháp. Sau đó, cú đúp được chấm dứt bằng dấu chấm phẩy. Tôi chưa bao giờ thấy cú đúp sau cuộc gọi hàm tạo. Nó có bình thường không? Nó được gọi như thế nào? Cảm ơn bạn!

p.s: trên Eclipse, nếu tôi xóa dấu chấm phẩy, nó sẽ báo lỗi LocalVariableDeclarationStatement.

Trả lời

5

Đó là số anonymous class.

Lớp ẩn danh có thể hữu ích khi bạn muốn tạo lớp học có nguồn gốc từ một lớp hoặc giao diện khác nhưng bạn không cần sử dụng lớp mới của mình ở bất kỳ nơi nào khác trong mã của bạn.

Một trong những điều thanh lịch nhất về các lớp ẩn danh là chúng cho phép bạn xác định lớp học một lần chính xác ở nơi cần thiết. Ngoài ra, các lớp ẩn danh có cú pháp ngắn gọn làm giảm sự lộn xộn trong mã của bạn.

Trong trường hợp cụ thể của bạn lớp DefaultHandler là một lớp helper mà thực hiện nhiều giao diện (EntityResolver, DTDHandler, ContentHandler, ErrorHandler) bằng cách cung cấp phương pháp mà không làm gì cả. Ý tưởng là bạn có thể lấy được từ lớp này và chỉ ghi đè lên các phương thức cụ thể mà bạn cần. Điều này có thể ít hơn nhiều so với việc triển khai trực tiếp các giao diện bởi vì sau đó bạn sẽ cần cung cấp các định nghĩa cho mọi phương thức, bao gồm cả các phương thức mà bạn không định sử dụng.

5

đây là định nghĩa lớp ẩn danh. DefaultHandler là một giao diện và không có triển khai thực hiện và bạn đang tạo một giao diện ở đó, trong khi tạo một cá thể.

từ DefaultHandler là giao diện mà nó mong đợi đối tượng của lớp thực hiện giao diện DefaultHandler. Nhưng nếu không có lớp như vậy hoặc bạn cần một lớp khác, bạn có thể tạo một đối tượng đáp ứng yêu cầu này bằng cách thực hiện giao diện khi đang di chuyển.

+0

Tôi biết rằng một lớp thực hiện Giao diện nên xác định TẤT CẢ các phương thức được khai báo trong giao diện, tôi có sai không? Trong ví dụ của tôi, chỉ có 3 phương pháp được xác định! – Angelo

+1

Nó không phải là một giao diện - đó là một lớp học. Kiểm tra tài liệu cho DefaultHandler. –

+1

bạn là đúng nhưng 'DefaultHandler' có thể là AbstractClass và trong trường hợp đó bạn chỉ cần xác định phương thức trừu tượng – destan

4

Đó là một lớp bên trong vô danh. Có một google cho 'java lớp ẩn danh'. Về cơ bản nó là một lớp được tạo ra trên bay từ một giao diện. Toàn bộ định nghĩa được xác định nội tuyến được coi là một định nghĩa lớp sau phần 'DefaultHandler()' mới rõ ràng là định nghĩa lớp cụ thể này chỉ có thể được sử dụng ở nơi này.

1

Thats định nghĩa lớp ẩn danh. Về cơ bản nó là một cách để thực hiện một lớp Abstract hoặc mở rộng một lớp. Vì vậy, bạn đang triển khai lớp DefaultHandler hoặc extend ing DefaultHandler tùy thuộc vào việc DefaultHandler là lớp học abstract hay lớp bê tông.

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