2011-12-21 12 views
6

Theo JLS:Tại sao tất cả các lớp ẩn danh ngầm hoàn toàn?

15.9.5 Anonymous Lớp khai báo Tờ khai lớp nặc danh được tự động lấy từ một biểu thức tạo lớp dụ bởi trình biên dịch .

Lớp ẩn danh không bao giờ trừu tượng (§8.1.1.1). Một lớp vô danh là luôn là một lớp bên trong (§8.1.3); nó không bao giờ tĩnh (§8.1.1, §8.5.2). Một lớp ẩn danh luôn luôn là hoàn toàn cuối cùng (§8.1.1.2).

Điều này có vẻ như đó là một quyết định thiết kế cụ thể, vì vậy rất có thể là nó có một số lịch sử.

Nếu tôi chọn để có một lớp học như thế này:

SomeType foo = new SomeType() { 
    @Override 
    void foo() { 
     super.foo(); 
     System.out.println("Hello, world!"); 
    } 
}; 

Tại sao tôi không được phép phân lớp nó một lần nữa nếu tôi nên chọn cái nào?

SomeType foo = new SomeType() { 
    @Override 
    void foo() { 
     super.foo(); 
     System.out.println("Hello, world!"); 
    } 
} { 
    @Override 
    void foo() { 
     System.out.println("Hahaha, no super foo for you!"); 
    } 
}; 

Tôi không nói rằng tôi nhất thiết muốn, hoặc thậm chí có thể nghĩ ra lý do tại sao tôi lại làm như vậy. Nhưng tôi tò mò tại sao đây là trường hợp.

+0

Bạn có nhận "cú pháp không cho phép" không? ;-) Đó có thể là lý do tại sao họ nói "_implicitly_ final" ... chỉ đoán thôi. –

+1

khi được biên dịch, chúng không ẩn danh và không riêng tư. Tuy nhiên, chúng vẫn chứa siêu dữ liệu và đảm bảo chúng không có trường hợp siêu kỳ lạ (bằng cách mở rộng) – bestsss

+0

@David, có lý do kỹ thuật quá – bestsss

Trả lời

6

Vâng, sẽ khá là vô dụng khi có thể phân lớp một lớp ẩn danh. Điểm duy nhất mà bạn có thể tham chiếu đến lớp ẩn danh sẽ nằm trong câu lệnh được xác định (như ví dụ giả giả giả của bạn). Điều này có nghĩa là chương trình sẽ được bảo đảm không bao giờ tạo ra bất kỳ trường hợp nào của siêu lớp ẩn danh - và rằng trình biên dịch thông minh sẽ có thể thu gọn hai định nghĩa thành một lớp.

Thực tế hơn, khi một lớp là cuối cùng, trình biên dịch và máy ảo được tự do để nội tuyến phương pháp của nó tại các trang web gọi điện thoại. Vì vậy, trong bất kỳ tình huống nào mà tự nhiên không thể mở rộng một lớp nhất định, nó có ý nghĩa để làm cho các lớp như vậy về bản chất là cuối cùng.

+1

Có các trường hợp, đặc biệt là trong mã thử nghiệm (chế nhạo, gián điệp), nơi sẽ hữu ích khi phân lớp một lớp ẩn danh. – steventrouble