2016-07-20 7 views
0

Ich bin Entwickler von C# Unity3D und musste vor kurzem in Java springen, um ein Plugin für ein Android-Spiel zu erstellen, an dem ich gerade arbeite. Kurz gesagt, dient dieses Plugin dazu, Java-Netzwerkfunktionen zu verwenden, damit ein Spieler ein Match, das er auf seinem Telefon hostet, für andere in einem LAN ausstrahlen lässt.Wo ist Enumeration <T> implementiert?

Für dieses Plugin musste ich alle Netzwerkschnittstellen auf dem Gerät bekommen, alle Local-Link- oder Loopback-IPs herausfiltern und dann (vorausgesetzt es gibt nur noch 1 Restadresse) die verbleibende Adresse für Broadcasting verwenden . Ich habe dies erfolgreich getan, aber ich konnte nicht von dieser Linie meines Codes gestört werden helfen:

Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces(); 

ich in letzter Zeit mehr neugierig auf das Innenleben der Dinge geworden sind. Unity3D hat eine großartige API und Dokumentation, aber in letzter Zeit benutze ich die mitgelieferte IDE (MonoDevelop), um ihren verwalteten Quellcode zu sehen, damit ich besser verstehen kann, wie die Dinge gemacht werden. Diese Frage hilft mir wirklich wieder einmal dabei, meine Neugier zu wecken.

Ich möchte darauf hinweisen, sogar in C# Ich habe nicht wirklich mit Schnittstellen so nackig mit mir gearbeitet, während ich versuche, dies durcheinander zu bringen.

Also ... Enumeration ist eine Schnittstelle, die implizit abstrakt ist, und ihre Funktionen sind auch, was bedeutet, dass eine Klasse es implementieren muss, um das Verhalten ihrer Funktionen zu definieren.

Betrachtet man NetworkInterface auf docs.oracle.com, scheint es keine Enumeration zu implementieren, aber es hat eine Funktion (siehe oben), die mir eine Enumeration vom Typ NetworkInterface mit einer funktionierenden nextElement() - Funktion zurückgibt. Nicht nur das, sondern weil Enumeration eine Schnittstelle ist, wie kann eine Funktion mir sogar eine liefern? Schnittstellen, wie abstrakte Klassen, können nicht instanziiert werden, und dennoch wurde mir diese Enumeration-Instanz mit definierten Funktionen gegeben, die ich aufrufen kann und die Netzwerkschnittstellen enthält, nach denen ich gefragt habe.

Wenn es mir ein Objekt eines (offensichtlich nicht-abstrakten) Typs zurückgibt, der Enumeration implementiert hat und vielleicht ein privates Array vom Typ NetworkInterface hält, denke ich, dass all dies für mich mehr Sinn ergibt.

Vielen Dank im Voraus.

+0

Schnittstellen sind wie ein Vertrag. Die von Ihnen erwähnte Methode gibt ein Objekt zurück, das dem durch 'java.util.Enumeration' definierten Vertrag gehorcht, aber nichts darüber hinaus verspricht.Dies ist nützlich, damit die Implementierung geändert werden kann, ohne dass einer der Clients sich darum kümmern muss. – biziclop

+2

Vorschlag für das nächste Mal: ​​Es gibt eine Menge von irrelevanter Exposition oben. Ich empfehle Ihnen, Ihre Frage klar und prägnant zu stellen. In diesem Fall könnte es etwa drei Sätze lang sein. –

+1

@ T.J.Crowder bekannt. Sorry, wollte nur einige Hintergrundinformationen bereitstellen, so dass die Leute eine Vorstellung von meinem Wissensstand hatten und dass das Problem nicht war, dass der Code nicht funktionierte, es war nur eine Frage, wie es funktioniert. – isNull

Antwort

3

bei Network auf docs.oracle.com Sehen, es scheint nicht Enumeration ...

Richtige zu implementieren, ist es nicht viel Sinn für NetworkInterfaceselbstEnumeration zu implementieren machen würde, wie es keine Aufzählung ist. Stattdessen hat es eine innere Klasse, die es verwendet, um die Enumeration<NetworkInterface> zu implementieren, und es ist eine Instanz , die Klasse, die Sie von getNetworkInterfaces erhalten.

Dies ist ein allgemeines Muster. Sie können die Implementierung in der NetworkInterface.java-Datei, in den src.zip in JDK installieren:

public static Enumeration<NetworkInterface> getNetworkInterfaces() 
    throws SocketException { 
    final NetworkInterface[] netifs = getAll(); 

    // specified to return null if no network interfaces 
    if (netifs == null) 
     return null; 

    return new Enumeration<NetworkInterface>() {    // This is the 
     private int i = 0;         // anonymous 
     public NetworkInterface nextElement() {    // inner class used 
      if (netifs != null && i < netifs.length) {  // to implement 
       NetworkInterface netif = netifs[i++];   // Enumeration<NetworkInterface> 
       return netif;         // 
      } else {           // 
       throw new NoSuchElementException();   // 
      }             // 
     }              // 
                   // 
     public boolean hasMoreElements() {     // 
      return (netifs != null && i < netifs.length);  // 
     }              // 
    };              // 
} 

In diesem Fall ist es eine anonyme innere Klasse. Andere Male werden sie innere Klassen genannt, wie Itr in AbstractList.java (auch in src.zip).

+0

Danke. Ich werde etwas über innere und anonyme Klassen lernen müssen, denke ich, denn das ist ein Thema, mit dem ich nicht vertraut bin. Die Syntax verwirrt mich ein wenig, weil es fast scheint, dass es eine neue Instanz der Enumeration-Schnittstelle zurückgibt, anstatt ein neues Objekt eines Typs, der es implementiert (Aber das muss der Trick einer anonymen Klasse sein?). Ich nehme an, dass https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html ein guter Anfang ist. – isNull

+0

@ hey-m8: Ja, genau das ist der Anfang. Und ja, die Syntax schafft tatsächlich eine neue Instanz. Es macht zwei Dinge auf einmal: Erstellen einer anonymen Klasse, die 'Enumeration ' ** und ** implementiert und dann sofort eine Instanz dieser Klasse erstellt und zurückgibt. –

Verwandte Themen