Java JVM能否在运行时优化非更改枚举方法?
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
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能否将每个enumECSResource
实例映射到其唯一对应的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之类的东西来攻击这样的特性