java - 条件三元与对数据库的方法调用

标签 java c# performance conditional-operator method-call

所以过去几年我一直在这里潜伏,终于遇到了我在这里找不到现有答案的情况。这个问题本身很简单。


假设以下语句(没有特定于语言的语法):

var result = fetchFromDb() == null ? defaultValue : fetchFromDb().property;

我想知道的是:Java或C#中的编译器是否有办法优化这个语句,或者是否真的有两次调用fetchFromDb()方法意味着两个数据库访问调用、两个执行计划等等?

我已经在 J​​ava 中对此进行了测试,发现该方法被调用了两次,但我不知道后台的最终缓存或类似情况。

那么:在方法中使用三元条件是一种不好的做法吗?有没有办法缓存与内联比较的值,以保持这种风格的美感?

最佳答案

是的,永远都是两个电话。事实上,在第一次调用和第二次调用之间,fetchFromDb() 的结果可能会发生变化。编译器无法预测值的变化,除非它是众所周知的确定性函数。确定性是这里的关键词。即使如此,编译器也可能不会对此类事情进行优化。

在方法中使用三元条件本身并不是坏习惯,但它的可读性不如简单的 if 语句。

保证单次调用的唯一方法是编写单次调用代码。

var result;
var fetchResult = fetchFromDb();
if (fetchResult == null) {
    result = defaultValue;
} else {
    result = result.property;
}

或者如果您坚持使用三元

var fetchResult = fetchFromDb()
var result = (fetchResult == null) ? defaultValue : result.property;

我真的认为这比三元要清晰得多。将代码放在一行上并不能推断出漂亮的代码。

关于java - 条件三元与对数据库的方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30523730/

相关文章:

java - 如何在 Java 中更改目录并执行其中的文件

c# - 如何在 MVVM Light SimpleIoc 中注册一系列依赖项

java - 为什么 Java SIMD(巴拿马)比标量慢?

sql - 将最后的 'x' 结果保存在数据库中

.net - 当呈现大量 UI 控件时,如何在 WPF 中获得最佳性能?

java - 使用 Bouncy CaSTLe 和 Node.js 加密时的不同结果

java - 使用 pom.xml 设置 Spring MVC,并使用 slfj 日志记录和泄漏

java - 什么是 NullPointerException,我该如何解决?

c# - PHP 开发人员对 Java 的思考

c# - 如何在 Blueprism 中指定列名和数据项?