我在Google Guava Github上找到了这段代码,我无法弄清楚为什么在第 5 行,rowMap如果条件满足,该方法不返回 void:private transient @MonotonicNonNull Map<R, Map<C, V>> rowMap;public Map<R, Map<C, V>> rowMap() { Map<R, Map<C, V>> result = rowMap; return (result == null) ? rowMap = createRowMap() : result;}Map<R, Map<C, V>> createRowMap() { return new RowMap();}这条线不会等同于:if (result == null) { return rowMap = createRowMap();} else { return result;}然后对 rowMap 的赋值将返回 void。我错过了什么?
2 回答
慕盖茨4494581
TA贡献1850条经验 获得超11个赞
我错过了什么?
赋值表达式的结果就是被赋值的值。:-) 所以在该代码中,调用的结果createRowMap被分配给rowMap 并作为rowMap函数的结果返回。就像:
a = b = 42;
...设置b为42然后设置a为42(b = 42赋值的结果)。
效果就像代码是这样写的一样:
public Map<R, Map<C, V>> rowMap() {
Map<R, Map<C, V>> result = rowMap;
if (result != null) {
return result;
}
rowMap = createRowMap();
return rowMap;
}
MMTTMM
TA贡献1869条经验 获得超4个赞
赋值表达式的求值结果varibale = value是value,试试:
int a;
System.out.println(a = 1); // 1
所以它等于:
if (result == null) {
rowMap = createRowMap();
return rowMap;
}
查看 jls 了解更多:
当程序中的表达式被评估(执行)时,结果表示以下三件事之一:
变量(第 4.12 节)(在 C 中,这将称为左值)
一个值(第 4.2、第 4.3 节)
无(该表达式被称为无效)
...
当且仅当它是调用不返回值的方法的方法调用(第 15.12 节),即声明为 void 的方法(第 8.4 节)时,表达式不表示任何内容。
添加回答
举报
0/150
提交
取消