所以,我使用的 API 在某些方面有点不友好。 基本上,这个 API 创建一个可以稍后获取的资源。 当我们稍后去获取时,该资源可能仍然存在,也可能不存在。
要获取之前创建的资源,您必须使用结果 GUID,如下所示:
String resultKey = "12345";
PersistedResult r = mFactory.getPersistedResult(resultKey);
现在,这里棘手的事情是
getPersistedResult
在使用无效的 guid 调用时不会抛出异常... PersistedResult
是一个惰性加载器,只有在调用其方法之一时才会失败(导致对象加载本身)。
因此,为了尝试确定资源是否有效,我正在执行以下操作:
PersistedResult r = null;
if (!StringUtils.isEmpty(resultKey)) {
try {
r = mFactory.getPersistedResult(resultKey);
r.getResultCount(); // Triggers exception if result key was invalid.
} catch (Exception e) {
// handle exception
}
}
我对
getResultCount
的调用是否有被优化的风险,因为我没有使用该值?
在
PersistedResult
上调用任何方法都会转到外部数据库,以防万一。
编译器不能假设 getResultCount() 没有副作用——因此它不能删除调用。
不,为什么会这样?要么
getResultCount
不会被内联,在这种情况下它是一个黑盒并且必须被执行,因为它可以做任何事情,或者它将被内联,在这种情况下编译器可以看到它可能会抛出异常,并且将执行该操作。
它有返回值这一事实并不重要。如果这是一个因素,那么如果调用者不检查其返回值,任何复杂性的任何函数都将面临被优化的风险。
运行时(或编译时,相同)的优化不允许给您提供与未优化任何内容时不同的结果(除了运行时或内存节省之外)。如果这里由于优化而没有抛出异常,那么这绝对是另一种行为,因此将是一个错误。
(注意,在多线程环境中,当考虑不同线程之间的关系时,这有点宽松。)
不。因为优化无法改变代码的语义。