Java 具有对db的方法调用的条件三元

Java 具有对db的方法调用的条件三元,java,c#,performance,conditional-operator,method-call,Java,C#,Performance,Conditional Operator,Method Call,所以,在过去的几年里,我一直潜伏在这里,最终我发现我在这里找不到一个现有的答案。问题本身很简单 假设以下语句(没有特定于语言的语法): 我想知道的是:Java或C语言中的编译器是否有优化此语句的方法,或者是否真的有两个对fetchFromDb()方法的调用,这意味着两个DB访问调用、两个执行计划等等 我已经在Java中对此进行了测试,发现该方法被调用了两次,但我不知道最终会在后台进行缓存还是类似的事情 那么:使用三元条件方法是一种糟糕的做法吗?是否有一种方法可以缓存与内联比较的值,以保持此样式

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


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

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

我已经在Java中对此进行了测试,发现该方法被调用了两次,但我不知道最终会在后台进行缓存还是类似的事情


那么:使用三元条件方法是一种糟糕的做法吗?是否有一种方法可以缓存与内联比较的值,以保持此样式的美观?

是的,它将始终是两个调用。事实上,在第一次调用和第二次调用之间,
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;
我真的认为这比三元模型更清楚。将代码放在一行上并不意味着代码漂亮。

实际上

var result = fetchFromDb() == null ? defaultValue : fetchFromDb().property;
将在
else
案例中进行两次调用。要避免双重呼叫:

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

var结果=从DBSupplyingDefaultValue(defaultValue)获取;除非它是一个众所周知的函数,否则它不会得到优化。人们通常认为三元运算符是if的替代品,而事实并非如此。虽然这种风格在很多情况下可能很吸引人,但试图将所有ifs强制为三元运算符(从Java/C的角度来看)是没有意义的。感谢您澄清这一点。尽管如此,在三元条件下使用一些
变量还是不错的,就像在C#中使用自定义属性设置器一样。。。当然,db可以在两次调用之间进行更改,但我为什么要关心这个更改呢?会让比较毫无意义。
var fetch = fetchFromDb();
var result = fetch != null ? fetch.property : defaultValue;