sun.misc.SharedSecrets的用法

Jon*_*Jon 9 java

我最近在我们的代码库中找到了这个小宝石.我必须承认,我完全不知道为什么这个枚举是以这种方式编写的(名称改为保护无辜者):

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);
   }
}
Run Code Online (Sandbox Code Playgroud)

在getValues()方法中,而不是简单地调用MysteryEnum.values()它来使用调用sun.misc.SharedSecret来获取被调用内容的句柄sun.misc.JavaLangAccess,然后使用来获取所有枚举值的数组.在该类的Javadoc告诉你的方法做什么,但我不能找到太多的为什么你会想将它命名.

写这篇文章的开发者已经不在了,所以我不能问他.无论如何我会问我的团队,但我觉得答案是:"不知道为什么会这样,但最好不要改变它".目前,我假设这是一个奇怪的情况,有人不知道该values()方法存在,或者我对sun.misc库的无知导致我错过了其他人明显的东西.知道这个代码是用这种方式编写的吗?

Pet*_*rey 9

该方法返回相同的数组而不反射或复制/克隆基础数组.这样可以提高性能,但是暴露可变数组并不是一个好主意.

for (int i = 0; i < 3; i++)
    System.out.println(SharedSecrets.getJavaLangAccess().getEnumConstantsShared(AccessMode.class));
AccessMode[] ams = SharedSecrets.getJavaLangAccess().getEnumConstantsShared(AccessMode.class);
ams[1] = ams[2]; // don't do this !!
System.out.println(EnumSet.allOf(AccessMode.class));
Run Code Online (Sandbox Code Playgroud)

版画

[Ljava.nio.file.AccessMode;@330cdec1
[Ljava.nio.file.AccessMode;@330cdec1
[Ljava.nio.file.AccessMode;@330cdec1
[READ, EXECUTE, EXECUTE]
Run Code Online (Sandbox Code Playgroud)

我没有使用这种方法,而是使用自己的缓存副本

// cannot be modified.
private static final AccessMode[] ACCESS_MODES = AccessMode.values();
Run Code Online (Sandbox Code Playgroud)