加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 运行时可以通过JVM优化一个不改变的枚举方法吗?

发布时间:2020-12-14 19:27:39 所属栏目:Java 来源:网络整理
导读:在以下情况下,JVM能否执行运行时优化? 我们有以下情况,我们有这个界面: public interface ECSResource { default int getFor(final Entity entity) { return ResourceRetriever.forResource(this).getFor(entity); }} 具体实现如: private static enum Te
在以下情况下,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>但我不能说这是否真的有效,更不用说是不是一个好主意.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读