2016-06-03 10 views
10

Hinweis: Ich stelle nicht die uralte Frage, warum äußere Variablen, auf die in einer anonymen Klasse zugegriffen wird, als final deklariert werden müssen.Hat das Hinzufügen des Schlüsselwortes "final" zu Methoden in anonymen Klassen Auswirkungen?

Wenn eine anonyme Klasse in Java erstellen, können Sie zusätzliche Methoden hinzufügen, wenn Sie es wünschen:

Runnable r = new Runnable() { 
    public void run() { 
     internal(); 
    } 

    public void internal() { 
     .. code .. 
    } 
}; 

jedoch Java können Sie auch die zusätzlichen Methoden wie final erklären:

public final void internal() { ... } 

Meine Frage ist: Sind diese Methoden nicht bereits effektiv endgültig, und hat das Hinzufügen des final Schlüsselwortes irgendwelche Auswirkungen?

+4

Weil es Parsing einfacher macht? – kennytm

+0

Sie können feststellen, ob die Methode "final" ist oder nicht, wenn Sie eine Reflektion für diese Klasse verwenden. –

+2

Nun, Java erlaubt es bereits, "final" auf Methoden in Klassen zu schreiben, die selbst 'final' sind, obwohl es absolut unnötig ist ... –

Antwort

13

Die Java-Spezifikation über final methods sagt:

A private Verfahren und alle unmittelbar innerhalb einer final Klasse deklarierten Methoden (§8.1.1.2) verhalten, als ob sie final sind, da es unmöglich ist, sie außer Kraft zu setzen.

und von Anonymous Class Declarations:

Eine anonyme Klasse ist immer implizit final (§8.1.1.2).

Daher ist es eine anonyme Klasse ist bereits final, die final alle ihre Methoden macht. Sie können den Modifikator final hinzufügen, aber er ist redundant.


Ein interessanter Kommentar von Sotirios Delimanolis zeigt, dass das Reflection-API tatsächlich nicht den final Modifikator für eine anonyme Klasse berichten:

public class Main { 
    public static void main(String[] args) { 
     Main anon = new Main() {}; 
     System.out.println(Modifier.isFinal(anon.getClass().getModifiers())); // prints false 
    } 
} 

Dies ist offenbar ein bekannter Fehler (JDK-8129576), die geplant ist, in Java 9 behoben werden.

+0

Danke für die knappe und gut referenzierte Antwort! –

+1

[JVM spielt nicht nach den Regeln.] (Http://ideone.com/IyPWp8) Oder was auch immer kompiliert wird. –

+1

@SotiriosDelimanolis Ich habe [diesen Fehlerbericht] (https://bugs.openjdk.java.net/browse/JDK-4777101) gefunden, der "kein Problem" =/ist. – Tunaki

Verwandte Themen