2012-05-11 19 views
14

Ich habe das folgende Beispiel in einem der Java-Forum gefunden.Was ist das Schreiben einer Klasse innerhalb einer Schnittstelle

Ich habe das obige Code-Snippet ausgeführt und es wird erfolgreich kompiliert. Das bedeutet, dass wir eine Klasse in einer Schnittstelle haben können.

Meine Frage ist, was ist der Gebrauch solcher Klassen? Ist es irgendein Entwurfsmuster?

+2

selbst wenn dies kompilieren, ist es nicht etwas, was jemand tun sollte. – memo

+1

mögliche Duplikate von [innere Klasse innerhalb der Schnittstelle] (http://stackoverflow.com/questions/2400828/inner-class-within-interface) – NPE

+4

@memo - ich stimme nicht zu. Es gibt Situationen, in denen dies richtig ist. –

Antwort

9

Dieser Codeausschnitt beantwortet Ihre Frage bereits. Die Klasse Role wird von der employee Schnittstelle in getRole() Methode verwendet. Der Designer der Schnittstelle entschied, dass diese Klasse so eng mit der Schnittstelle verbunden ist, dass es sich lohnt, sie innerhalb dieser Schnittstelle zu definieren, um zu betonen, wie wichtig diese Klasse für die Schnittstelle ist.

Auch es bietet semantischen Namespace für die Klasse: employee.Role. Allerdings sehe ich diese Art von Konstrukten zum ersten Mal, während statische Klassen, die in anderen Klassen definiert sind, durchaus üblich sind (zu den gleichen Zwecken wie oben).

4

Die Verwendung hier ist die gleiche wie für jede innere Klasse. Es beschränkt den Umfang der Klasse auf den Bereich, in dem sie enthalten ist.

In diesem Fall dachte der Implementierer, dass Role nicht als Top-Level-Klasse geeignet war, und legte es in die employee Schnittstelle. Der Grund dafür ist höchstwahrscheinlich, dass die Absicht von Role eng mit employee gekoppelt werden soll.

1

Die Klasse stellt einen wichtigen Teil der Schnittstelle dar: Ein Rückgabewert für getRole. Daher ist es sinnvoll, die Klasse innerhalb der Schnittstelle zu definieren.

Es wäre ein bisschen häufiger eine Schnittstelle innerhalb einer Schnittstelle für diese Art der Sache (wie Map.Entry in java.util) zu definieren, mehr Flexibilität zu ermöglichen, wenn die Schnittstelle implementiert, aber Sie können auch die Klasse tun.

0

Ich würde nicht so ein Stück Code schreiben, aber ich denke, die Verwendung besteht darin, die Abhängigkeit zwischen der Klasse und der Schnittstelle zu betonen.

Schnittstellen werden verwendet, um API zu definieren und in diesem Fall wollte der Autor sagen, dass "diese beiden nicht getrennt leben können".

Hoffe, das hilft.

1

Es gibt eine leichte Zusammenstellung Problem mit Ihrem Beispiel, die ich weiter unten festgelegt haben:

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

Role getRole(); 
} 

Abgesehen davon, ja, es kompiliert. Das bedeutet nicht, dass dies eine gute Idee ist. Es ist eine weitere Möglichkeit, die Role Klasse zu benennen, aber ich denke, es ist ziemlich hässlich.

0

Ich würde nicht so ein Stück Code schreiben, aber ich denke, die Verwendung besteht darin, die Abhängigkeit zwischen der Klasse und der Schnittstelle hervorzuheben.

Schnittstellen werden verwendet, um API zu definieren und in diesem Fall wollte der Autor sagen, dass "diese beiden nicht getrennt leben können".

Verwandte Themen