2011-01-23 12 views

Trả lời

6

cú pháp duy nhất, vì vậy được gọi là các lớp ẩn danh là các lớp bình thường 100%. bạn có thể có thể đạt được một kết quả sôi nổi bằng cách sử dụng java.lang.reflect.Proxy và InvocationHandler, sẽ là cách bẩn thỉu nhất để làm điều đó.

cách đơn giản bao gồm tuyên bố lớp trong phương pháp này và chỉ cần thêm 'cụ',

lớp
6

Anonymous được cung cấp như là một cách nhanh chóng và ngắn gọn xây dựng một lớp "một off". Câu hỏi của bạn cho thấy rằng bạn đang cố gắng sử dụng lớp anon của bạn theo nhiều cách (ít nhất một giao diện và một giao diện mở rộng). Trong trường hợp này, nó sẽ dễ đọc hơn và dễ bảo trì hơn nếu bạn quảng cáo lớp anon đó với một lớp học đầy đủ.

Điều này cũng sẽ ngăn chặn các tác dụng phụ không mong muốn bằng cách quản lý tốt hơn gói đóng gói của các lớp học của bạn.

6

Tìm thấy một hack xung quanh này

tạo một giao diện ở dưới cùng của tập tin phù thủy của bạn mở rộng tất cả các giao diện mà bạn muốn thực hiện sau đó tạo ra một lớp vô danh trong đó thực hiện điều này.

+2

Tôi không biết rằng tôi sẽ gọi đây là hack – Michael

23

Trong đó có vấn đề nội bộ tại sao các lớp ẩn danh java không thể triển khai và phân lớp cùng một lúc?

Tôi tin rằng đó là 99% do lý do cú pháp. Loại tham số thậm chí hỗ trợ intersection types (<T extends InterfaceX & InterfaceY>) vì vậy tôi không nghĩ rằng bất kỳ "mâu thuẫn" hoặc thậm chí biến chứng sẽ phát sinh trong hệ thống kiểu nếu hỗ trợ cho tính năng đó sẽ được thêm vào.

Một biểu hiện như new (InterfaceX & InterfaceY)() { ... } rất tốt có thể được biên dịch vào một cái gì đó giống như

interface InterfaceXandY extends InterfaceX, InterfaceY {} 

... new InterfaceXandY() { ... } 

Lý do không có sự hỗ trợ cho nó rất có thể là do thực tế rằng đó là một trường hợp sử dụng rất hiếm khi mà có một giải pháp đơn giản.


Trên ghi chú có liên quan một phần. Bạn thể cho một lambda thực hiện ví dụ Serializable bằng cách làm

Runnable r = (Runnable & Serializable)() -> System.out.println("Serializable!"); 

Xem How to serialize a lambda?

+0

Câu trả lời hay nhất +1. Hoàn toàn đồng ý rằng nếu có một công việc rất tầm thường xung quanh, tại sao thực hiện một thay đổi cơ bản trong ngôn ngữ và giới thiệu một cú pháp cồng kềnh của hai loại tĩnh. –

4

According to James Gossling:

đóng cửa bị gạt ra khỏi Java ban đầu hơn vì thời gian áp lực hơn bất cứ điều gì khác . Trong những ngày đầu của Java, việc thiếu các đóng cửa khá đau đớn và do đó các lớp bên trong được sinh ra: một sự thỏa hiệp không thoải mái khi cố gắng tránh một số vấn đề khó khăn . Nhưng như là bình thường trong rất nhiều vấn đề thiết kế, các đơn giản hóa đã không thực sự giải quyết bất kỳ vấn đề, họ chỉ cần di chuyển chúng.

Thú vị, bây giờ biểu thức lambda và đóng được thêm vào Java, và lần này được thiết kế với một cái gì đó khác với lớp bên trong, chúng tôi có thể xác định một đối tượng trên bay được tạo bởi nhiều giao diện. một là giao diện điểm đánh dấu.

interface Bar { 
    default String getName() { return "Bar"; } 
} 

Object o = (Comparable<Integer> & Bar) (x,y) -> x > y ? x : y; 
Bar b = (Bar) o; 
System.out.println(b.getName()); //Bar 

Điều này biên dịch và chạy hoàn hảo trong bản xây dựng mới nhất của JDK 8 (ngày 12 tháng 3 năm 2013). Vì vậy, có vẻ như họ đã suy nghĩ nhiều hơn về vấn đề này.

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