我最近在我们的代码库中找到了这个小宝石.我必须承认,我完全不知道为什么这个枚举是以这种方式编写的(名称改为保护无辜者):
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库的无知导致我错过了其他人明显的东西.知道这个代码是用这种方式编写的吗?
该方法返回相同的数组而不反射或复制/克隆基础数组.这样可以提高性能,但是暴露可变数组并不是一个好主意.
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)
| 归档时间: |
|
| 查看次数: |
5942 次 |
| 最近记录: |