gpt4 book ai didi

java - JVM 可以在运行时优化一个不变的枚举方法吗?

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

JVM能否在以下场景下进行运行时优化?

我们有以下情况,我们有这个接口(interface):

public interface ECSResource {
default int getFor(final Entity entity) {
return ResourceRetriever.forResource(this).getFor(entity);
}
}

以及具体的实现如:

private static enum TestResources implements ECSResource {
TR1, TR2;
}

JVM 是否能够(在运行时)确定枚举实例(如 TestResources.TR1)属于单个 ResourceRetriever(如 ResourceRetriever.forResource) (TestResources.TR1)?

在原始实现中,每次调用 TestResources.TR1.getFor(...) 都会创建一个新的 ResourceRetriever 实例。

不过在这种情况下,我们知道(通过代码检查)对 ResourceRetriever.forResource(this) 的调用将调用以下内容:

public class ResourceRetriever {
private final ECSResource resource;

ResourceRetriever(ECSResource resource) {
this.resource = resource;
}

public static ResourceRetriever forResource(ECSResource resource) {
return new ResourceRetriever(resource);
}

//lots of methods
}

因此,由于随机结果、舍入误差等原因,在运行时不会发生任何变化。

问题由此而来:JVM 能否将每个 enum ECSResource 实例映射到其唯一对应的 ResourceRetriever.forResource(this) 实例?

请注意,您可以通过以下方式自行完成此类操作:

private static enum TestResources implements ECSResource {
TR1, TR2;

private static final Map<TestResources, ResourceRetriever> retrieverMapping;
static {
retrieverMapping = Arrays.stream(TestResources.values())
.collect(Collectors.toMap(res -> res, ResourceRetriever::forResource));
}

@Override
public int getFor(final Entity entity) {
return retrieverMapping.get(this).getFor(entity);
}
}

最佳答案

new 的语义关键字几乎肯定会禁止你想做的事情。 (参见 The Java Language SpecificationThe Java Virtual Machine Specification 中的引用资料。)您的 forResource方法总是会返回一个新对象。我不知道有任何 JVM 会做你想做的事情,因为没有机制来确定只有一个 ResourceRetriever应该为任何给定的 ECSResource 创建.这看起来像 memoization 的一种形式对我来说,这将由语言处理(例如 Groovy,它有一个专门用于此的注释)而不是由运行时(JVM)处理。如果 Java 有具体化的泛型,你可能会用类似 ResourceRetriever<? extends ECSResource> 的东西来破解这样的特性。但我不能说这是否真的有效,更不用说这是否是个好主意了。

关于java - JVM 可以在运行时优化一个不变的枚举方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26757902/

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