Java ha marcatori speciali su metodi chiamati synthetic
e bridge
.È possibile utilizzare un metodo sintetico o bridge per uniformare una modifica int -> double API?
JLS 13.1.7, "Qualsiasi costrutti introdotti da un compilatore Java che non hanno un corrispondente costrutto nel codice sorgente devono essere contrassegnati come sintetico ..."
metodi Così sintetici sono nulla generato dal compilatore e non rappresentato nel codice sorgente e benché non sia menzionato in quella specifica PDF molto bene, i metodi bridge vengono utilizzati per tipical generici. (Ad esempio Animal.interactWith(Creature c)
ottiene un metodo di bridge interactWith(Object c)
, che getta al Creatura e chiama l'altro metodo.)
Abbiamo questo API chiamata Bukkit, che fornisce l'accesso stabile a cambiare il funzionamento di un server di Minecraft. Un aspetto della sottostante implementazione dell'API (aka vanilla Minecraft), di cui abbiamo poco controllo, è stato recentemente forzato nella versione 1.6.1
per passare dai valori interi ai valori float. E nell'interesse di evitare la difficoltà di un altro cambiamento, abbiamo scelto di modificare tutti i nostri metodi API su double
s.
Così, ad esempio:
public int getHealth();
public void setHealth(int health);
// Must now be
public double getHealth();
public void setHealth(double health);
Tuttavia, come sempre, vorremmo plugin compilati con la versione precedente, 1.5.2
, a lavorare ancora per quanto possibile - questo è il punto di tutta l'API.
Il setHealth
è un problema risolto, basta introdurre un sovraccarico. Al momento, abbiamo un metodo denominato _INVALID_getHealth(V)I
che viene rinominato in fase di compilazione dell'implementazione (non compilazione API) su getHealth(V)I
e questo consente ai vecchi plug-in di continuare a funzionare.
Tuttavia, quando qualcuno tenta di estendere la nostra implementazione di questi metodi rinominati, ottengono errori di compilazione dai metodi con doppio nome e sovrascrittura.
C'è un modo per fornire sia le int
e double
rendimenti utilizzando un manualmente/ metodo sintetico o ponte utensile inserito, tale da non causare errori di compilazione per coloro che cercano di cambiare le parti della nostra implementazione API ?
Perché non denominare il metodo qualcosa di diverso e solo deprecare l'originale (o addirittura lasciarlo non deprecato), e farlo semplicemente restituire il doppio valore arrotondato a int? –
@ increment1 Sono d'accordo con te su come dovresti solo cambiare il nome ... Non riesco a ricordare quale oggetto Bukkit fosse, ma ricordo di aver visto metodi come '_INVALID_setHealth (int i)' e 'setHealth (double d)' – Jojodmo
@Jojodmo Suppongo che dovrei scrivere una risposta ... (Affermativo, sintetico + bridge è ciò di cui hai bisogno per compilare una sottoclasse) – Riking