18 Stimmen

Warum sollte eine Methode in Java flüchtig sein?

Warum sollte eine Methode flüchtig gemacht werden? Wie ändert sich das Verhalten einer Methode, wenn man sie flüchtig macht?

Edita: Ich habe eine toString() auf ein Methodenobjekt, das von einem Klassenobjekt (Java Reflection) zurückgegeben wird. Die Rückgabezeichenkette enthielt den Modifikator "volatile" (flüchtig) im Zusammenhang mit dem Methodennamen, der öffentlichen Sichtbarkeit und dem Rückgabetyp "void". Die Nachforschungen ergaben nur Informationen über volatile für Eigenschaften. Aus diesem Grund habe ich diese Frage gestellt.

Die Methodendeklaration war:

public volatile org.osmdroid.api.IGeoPoint org.osmdroid.views.MapView.getMapCenter()

Code für die Reflexionsmethode:

public static class Test {
    public static void showMethods(Object target) {
        Class<?> clazz = target.getClass();
        for (Method method : clazz.getMethods()) {
            if (method!=null) {
                System.out.println(method.toString());
            }
        }
    }
}

Methodenaufruf:

Test.showMethods(mapView);

40voto

Cowan Punkte 36327

Ich vermute stark, dass das, was Sie sehen, ein Nebeneffekt der Tatsache ist, dass die JLS das folgende Bit für Felder definiert:

public static final int VOLATILE = 0x00000040;

und das folgende Bit für Methoden:

static final int BRIDGE = 0x00000040;

Beachten Sie, dass sie denselben Wert haben (dasselbe Bit hat für Methoden und Felder eine unterschiedliche Bedeutung).

Wenn Sie z.B. aufrufen Modifier.toString(int) ohne, wie in der Dokumentation vorgeschlagen:

Beachten Sie, dass für eine solche Prüfung für eine bekannte Art von Entität, wie z.B. einen Konstruktor oder eine Methode, zuerst AND das Argument von toString mit der entsprechenden Maske aus einer Methode wie constructorModifiers o methodModifiers .

dann erhalten Sie eine unangemessene Ausgabe (einschließlich Brückenmethoden, die z. B. für kovariante Rückgabetypen automatisch generiert werden und als "volatile" angezeigt werden).

Zumindest das aktuelle OpenJDK Method.toString() filtert dies heraus; wenn dies bei Ihnen nicht der Fall ist, verwenden Sie vielleicht eine andere oder ältere Version des JDK, die dies nicht korrekt durchführt.

16voto

Jon Skeet Punkte 1325502

Das können Sie nicht. volatile ist nur ein gültiger Modifikator für ein Feld.

9voto

Jason Rogers Punkte 18940

Haben Sie gelesen

http://jeremymanson.blogspot.com/2008/11/what-volatile-means-in-java.html


nur um die Antwort zu vervollständigen:

wie alle anderen schon sagten: man kann eine Methode nicht flüchtig machen.

4voto

John Vint Punkte 38604

Man kann eine Methode nicht flüchtig machen. Sie lässt sich nicht kompilieren.

4voto

Andreas Dolk Punkte 110776

Erstens, nein volatile Methoden in Java. Punktum.

Java erlaubt die Deklaration von Feldern als volatile . In der Java-Sprachbeschreibung wird der Zweck erläutert:

Ein Feld kann als flüchtig deklariert werden. In diesem Fall gewährleistet das Java-Speichermodell, dass alle Threads einen konsistenten Wert für die Variable sehen.

Wenn wir nun versuchen, es zu übersetzen Methoden Bei einem flüchtige Methode etwas, das sicherstellt, dass alle Threads ein einheitliches Bytecode für die Methode. Aber das ist sowieso garantiert. Threads sehen nicht verschiedene Versionen einer Klasse, sie alle siehe denselben (kompilierten) Bytecode (solange sie keine Tricks mit Classloadern spielen...).

Es besteht also keine Notwendigkeit für volatile Methoden in Java.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X