私はこの仕事を私たちのコードベースで最近見つけました。私は、この列挙がこのように書かれていた理由は全くないアイデア(名前は無実を保護するために変更)持っていることを告白しなければなりません。代わりに、単純にそれはと呼ばれるものを使用していますMysteryEnum.values()
を呼び出すのでgetValues()メソッドでは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);
}
}
をsun.misc.SharedSecret
sun.misc.JavaLangAccess
という名前のハンドルを取得し、そのを使用してすべての列挙値の配列を取得します。そのクラスのJavadocは、メソッドが何をしているかを示していますが、なぜ多くを見つけることができませんあなたはそれを呼び出すと思います。
これを書いた開発者はもはや周囲にいないので、私は彼に尋ねることはできません。私はとにかく私のチームに尋ねるつもりですが、私は答えが "それがなぜそれをするのかわからないが、それを変えない方がいい"という気持ちがあります。現時点では、私はこれが、values()
メソッドが存在することを知らない人の奇妙なケースか、sun.miscライブラリの私の無知が私に他人に明らかなものを見逃す原因になっていると仮定しています。どのようなアイデアのこのコードは、このように書かれたのですか?基本的SharedSecret
私は参照してください。だからそれはパフォーマンスのハックだ。それの外観では、かなり脆いものです。 – Jon
'sun。*'の下では、それを避けるために十分注意してください。 'sun.misc.Unsafe'に似ています;) –
値を調べると、values()メソッドが実際にコンパイラによって追加されたように見えます(Javadoc for Enumにはありません)。そうであれば、どのように最適化されているかをどのように確認できますか?おそらくコンパイラは、値が呼ばれる場所のどこでも同じ配列へのハンドルを返すように最適化されていますか?これをチェックする方法はありますか? – Jon