Java verfügt über spezielle Marker für die Methoden synthetic
und bridge
.Kann eine synthetische oder eine Bridge-Methode verwendet werden, um eine int -> doppelte API-Änderung zu glätten?
JLS 13.1.7 „Alle von einem Java-Compiler eingeführt Konstrukte, die als synthetische markiert werden ... nicht über ein entsprechendes Konstrukt in den Quellcode haben muss“
So Synthesemethoden sind alles generiert durch den Compiler und nicht im Quellcode dargestellt, und obwohl es nicht in dieser Spezifikation PDF sehr gut erwähnt wird, Brücke Methoden werden verwendet, um Generika zu schreiben. (Z Animal.interactWith(Creature c)
bekommt eine Brücke Methode interactWith(Object c)
, die Kreatur wirft und ruft die andere Methode.)
Wir haben diese API genannt Bukkit, die stabilen Zugang bietet zu ändern, wie ein Server funktioniert Minecraft. Eine Facette der zugrunde liegenden Implementierung der API (alias vanilla Minecraft), auf die wir wenig Einfluss haben, wurde kürzlich in der Version 1.6.1
gezwungen, von Integer-Werten zu Float-Werten zu wechseln. Im Interesse, die Schwierigkeit einer weiteren Änderung zu vermeiden, haben wir alle unsere API-Methoden auf double
s geändert.
So zum Beispiel:
public int getHealth();
public void setHealth(int health);
// Must now be
public double getHealth();
public void setHealth(double health);
Aber wie immer, wir würden Plugins mit der vorherige Version kompilierten mögen, 1.5.2
, noch so viel wie möglich arbeiten -, dass der ganze Sinn der API ist.
Die setHealth
ist ein gelöstes Problem, nur eine Überlastung einführen. Und derzeit haben wir eine Methode mit dem Namen , die bei der Implementierung kompiliert wird (nicht API kompiliert) zu getHealth(V)I
, und das lässt die alten Plugins weiter ausgeführt werden.
Wenn jedoch jemand versucht, unsere Implementierung dieser umbenannten Methoden zu erweitern, erhalten sie Kompilierungsfehler von den doppelt benannten Methoden und überschreiben.
Gibt es eine Möglichkeit, sowohl die int
und double
kehrt, um eine manuell/Werkzeug eingefügt synthetische oder Brückenmethode verwenden, , die nicht Kompilierungsfehlern für diejenigen, die versuchen, zu ändern, Teile unserer API-Implementierung verursachen ?
Warum benennen Sie die Methode nicht anders und verachten das Original einfach (oder lassen es sogar veraltet) und lassen es einfach den doppelten Wert auf int gerundet zurückgeben? –
@ increment1 Ich stimme dir zu, wie du nur den Namen ändern solltest ... Ich kann mich nicht erinnern, was für ein Bukkit-Objekt es war, aber ich erinnere mich an Methoden wie '_INVALID_setHealth (int i)' und 'setHealth (double d)' – Jojodmo
@Jojodmo Ich denke, ich sollte eine Antwort schreiben ... (Affirmative, synthetische + Brücke ist, was Sie eine Unterklasse kompilieren müssen) – Riking