gpt4 book ai didi

java - sun.misc.SharedSecrets 的使用

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:13:29 30 4
gpt4 key购买 nike

我最近在工作的代码库中发现了这个小 gem 。我不得不承认,我完全不知道为什么要这样写这个枚举(为保护无辜者更改名称):

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);
}
}

在 getValues() 方法中,不是简单地调用 MysteryEnum.values(),而是使用名为 sun.misc.SharedSecret 的东西来获取名为 的东西的句柄>sun.misc.JavaLangAccess,然后使用 that 获取所有枚举值的数组。该类的 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));

打印

[Ljava.nio.file.AccessMode;@330cdec1
[Ljava.nio.file.AccessMode;@330cdec1
[Ljava.nio.file.AccessMode;@330cdec1
[READ, EXECUTE, EXECUTE]

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

// cannot be modified.
private static final AccessMode[] ACCESS_MODES = AccessMode.values();

关于java - sun.misc.SharedSecrets 的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9078599/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com