Java JVM能否在运行时优化非更改枚举方法?

Java JVM能否在运行时优化非更改枚举方法?,java,optimization,enums,jvm,runtime,Java,Optimization,Enums,Jvm,Runtime,JVM能否在以下场景中执行运行时优化 我们有以下情况,我们有这个接口: public interface ECSResource { default int getFor(final Entity entity) { return ResourceRetriever.forResource(this).getFor(entity); } } 以及具体实施,例如: private static enum TestResources implements ECSRe

JVM能否在以下场景中执行运行时优化

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

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)

在naive实现中,每次调用
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
}
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);
    }
}
因此,由于随机结果、舍入误差等原因,运行时不会发生任何变化

因此产生了一个问题:JVM能否将每个enum
ECSResource
实例映射到其唯一对应的
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
}
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);
    }
}
private static enum TestResources实现ECSResource{
TR1,TR2;
私有静态最终映射检索映射;
静止的{
retrieverMapping=Arrays.stream(TestResources.values())
.collect(Collectors.toMap(res->res,ResourceRetriever::forResource));
}
@凌驾
public int getFor(最终实体){
返回retrieverMapping.get(this).getFor(entity);
}
}

新的
关键字的语义几乎肯定会禁止你想做的事情。(请参阅和中的引用。)您的
forResource
方法始终将返回一个新对象。我不知道有哪种JVM会像您试图做的那样,因为没有任何机制可以确定只应该为任何给定的
ECSResource
创建一个
ResourceRetriever
。在我看来,这是一种形式的,由语言(例如Groovy,它有一个专门用于此的注释)而不是由运行时(JVM)处理。如果Java对泛型进行了具体化,您可能会用
ResourceRetriever之类的东西来攻击这样的特性