在以下情况下,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)?
在天真的实现中,每次调用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可以将每个枚举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); } }
解决方法
新关键字的语义几乎肯定会禁止你想要做的事情. (请参阅
The Java Language Specification和
The Java Virtual Machine Specification中的引用).您的forResource方法将始终返回一个新对象.鉴于没有任何机制可以确定为任何给定的ECSResource只能创建一个ResourceRetriever,所以我不知道任何JVM将会执行你想要做的事情.这看起来像
memoization的形式,它将由语言处理(例如Groovy,它具有专门针对此的注释),而不是运行时(JVM).如果Java已经被泛化了,那么你可能会把这样的功能与ResourceRetriever?扩展ECSResource>但我不能说这是否真的有效,更不用说是不是一个好主意.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。