Ho trovato questo piccolo gioiello nel nostro codebase al lavoro di recente. Devo confessare che non ho assolutamente idea del perché questo enum è stato scritto in questo modo (nomi cambiati per proteggere gli innocenti):Utilizzo di sun.misc.SharedSecrets
package foo.bar;
import sun.misc.SharedSecrets;
import foo.baz.HasAGetValuesMethod;
public enum MysteryEnum implements HasAGetValuesMethod {
THINGY, BOB;
@Override
public MysteryEnum[] getValues() {
return SharedSecrets.getJavaLangAccess().getEnumConstantsShared(MysteryEnum .class);
}
}
Negli getValues () il metodo invece di limitarsi a chiamare MysteryEnum.values()
sta usando qualcosa chiamato sun.misc.SharedSecret
per ottenere un handle per qualcosa chiamato sun.misc.JavaLangAccess
, quindi utilizzando che per ottenere una matrice di tutti i valori enum. Il Javadoc in quella classe ti dice quale sia il metodo, ma non riesco a trovare molto su perché lo vuoi chiamare.
Lo sviluppatore che ha scritto questo non è più in giro, quindi non lo può chiedere. Chiederò comunque alla mia squadra, ma ho la sensazione che la risposta sarà: "Non so perché lo fa, ma meglio non cambiarlo". Per il momento, presumo che questo sia un caso strano per qualcuno che non sa che il metodo values()
esiste, o che la mia ignoranza delle librerie di sun.misc mi sta facendo mancare qualcosa di ovvio agli altri. Qualche idea spiega perché questo codice sia stato scritto in questo modo?
Capisco. Quindi è un hack delle prestazioni. A giudicare dall'aspetto, piuttosto fragile. – Jon
È abbastanza oscuro, sotto 'sole. * ', Che dovresti sapere per evitarlo o gestirlo con cura. Simile a 'sun.misc.Unsafe';) –
Dopo una caccia, sembra che il metodo values () sia effettivamente aggiunto dal compilatore (non è su Javadoc per Enum). Se questo è il caso, allora come possiamo essere sicuri che quanto sopra sia anche ottimizzato in qualche modo? Forse il compilatore è ottimizzato per restituire un handle allo stesso array dove vengono chiamati i valori? C'è un modo per controllarlo? – Jon