gpt4 book ai didi

java - 守卫是否检查方法是否已被 Java 优化调用?

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

考虑以下代码:

public class BasicBuildOrder {
private List<GameObject> gameObjects = new ArrayList<>();

private List<GameObject> savedState;

public void saveState() {
savedState = new ArrayList<>(gameObjects);
}

public void resetToSavedState() {
if (savedState == null) {
throw new IllegalStateException("the state has not been saved");
}
gameObjects = savedState;
}

public void add(GameObject gameObject) {
gameObjects.add(gameObject);
}

public void get(int index) {
return gameObjects.get(index);
}

public void remove(GameObject gameObject) {
gameObjects.remove(gameObject);
}
}

我正在实现一种模式,您可以在其中将列表标记为以某种特定状态保存,然后恢复该状态。我知道当前保存/重置的方式有点阴暗并提供 O(n) 性能,而可以通过标记哪些项目已添加、检索、删除来改进。

现在我看到的一个问题是对 resetToSavedState() 的调用将在 saveState() 的调用之前完成,因此我需要检查一下。

我的问题是:如果 Java 知道 saveState( ) 已被调用,因此 savedState 不能再为 null 了吗?

附加问题,是否有可用于此 methodA-called-before-methodB 关系的模式?

最佳答案

在将 Java 源代码编译为 .class 文件时无法优化。如果 saveState()resetToSavedState() 都是从同一个方法调用的,并且在 JIT 编译期间内联(或一些更深的调用链是完全内联的)。在这里内联是很有可能的,因为 saveState()resetToSavedState() 非常简单。之后两者都成为外部方法的一部分,在构建控制流图和值分析之后,可能会确定没有控制路径进入 if 语句,因此此类 CFG 边将被修剪.但是,您不应该相信这会发生。

一般来说,您无法仅通过查看程序代码(而不实际执行)来可靠地预测程序顺序。然而,额外的 null 检查对性能几乎没有任何意义,所以你不应该担心它。

关于java - 守卫是否检查方法是否已被 Java 优化调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35254432/

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