2012-05-11 21 views
14

Tôi đã tìm thấy ví dụ sau trong một diễn đàn java.việc sử dụng cách viết một lớp bên trong một giao diện

interface employee{ 
    class Role{ 
      public String rollname; 
      public int roleId; 
      public Object person; 
    } 
    Role getRole(); 
    // other methods 
} 

Tôi đã thực thi đoạn mã trên và nó được biên dịch thành công. Có nghĩa là chúng ta có thể có một lớp bên trong một giao diện.

Câu hỏi của tôi là việc sử dụng các lớp học như thế là gì? Có bất kỳ mẫu thiết kế nào không?

+2

ngay cả khi biên dịch này, nó không phải là điều mà bất cứ ai cũng nên làm. – memo

+1

có thể trùng lặp của [lớp bên trong trong Giao diện] (http://stackoverflow.com/questions/2400828/inner-class-within-interface) – NPE

+4

@memo - Tôi không đồng ý. Có những tình huống mà đây là điều phải làm. –

Trả lời

9

Loại đoạn mã này đã trả lời câu hỏi của bạn rồi. Lớp Role được sử dụng bởi giao diện employee trong phương thức getRole(). Nhà thiết kế của giao diện quyết định rằng lớp này được kết hợp chặt chẽ với giao diện mà đáng để định nghĩa nó bên trong giao diện đó để nhấn mạnh tầm quan trọng của lớp đó đối với giao diện.

Ngoài ra, nó cung cấp không gian tên ngữ nghĩa cho lớp: employee.Role. Tuy nhiên tôi thấy kiểu cấu trúc này lần đầu tiên trong khi các lớp tĩnh được định nghĩa bên trong các lớp khác là khá phổ biến (cho các mục đích tương tự như trên).

4

Cách sử dụng ở đây giống như đối với bất kỳ lớp bên trong nào. Nó giới hạn phạm vi của lớp đến nơi nó thuộc về.

Trong trường hợp này, người triển khai nghĩ rằng Role không phù hợp với lớp cấp cao nhất và đặt nó bên trong giao diện employee. Lý do cho điều này rất có thể là ý định của Role là được kết hợp chặt chẽ với employee.

1

Lớp học cung cấp một phần quan trọng của giao diện: Giá trị trả về cho getRole. Vì vậy, nó có ý nghĩa để xác định lớp trong giao diện.

Nó sẽ là phổ biến hơn một chút để xác định một giao diện trong một giao diện cho các loại điều này (như Map.Entry trong java.util), cho phép linh hoạt hơn khi thực hiện giao diện, nhưng bạn có thể làm lớp là tốt.

0

Tôi sẽ không viết một đoạn mã như vậy, nhưng tôi nghĩ việc sử dụng là nhấn mạnh sự phụ thuộc giữa lớp và giao diện.

Giao diện được sử dụng để xác định API và trong trường hợp này, tác giả có thể muốn nói rằng "hai không thể tách rời".

Hy vọng điều này sẽ hữu ích.

1

Có một vấn đề biên soạn nhẹ với ví dụ của bạn, mà tôi đã cố định dưới đây:

public interface Employee { 
class Role{ 
     public String rollname; 
     public int roleId; 
     public Object person; 
    } 

Role getRole(); 
} 

Bên cạnh đó, vâng, nó biên dịch. Điều đó không có nghĩa là làm điều này là một ý tưởng hay. Đó là một cách xa hơn về cách đặt tên cho lớp Role của bạn, nhưng tôi nghĩ nó khá xấu xí.

0

Tôi sẽ không viết một đoạn mã như vậy, nhưng tôi nghĩ việc sử dụng là nhấn mạnh sự phụ thuộc giữa lớp và giao diện.

Giao diện được sử dụng để xác định API và trong trường hợp này, tác giả có thể muốn nói rằng "hai không thể tách rời".

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