我在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。我想念什么?
答案 0 :(得分:4)
我想念什么?
赋值表达式的结果就是所赋值的事实。 :-)因此,在该代码中,对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;
}
答案 1 :(得分:1)
赋值表达式varibale = value
的评估结果为value
,请尝试:
int a;
System.out.println(a = 1); // 1
所以等于:
if (result == null) {
rowMap = createRowMap();
return rowMap;
}
对程序中的表达式求值(执行)时,结果 表示三件事之一:
变量(第4.12节)(在C中,这称为左值)
一个值(§4.2,§4.3)
一无所有(该表达式被认为是无效的)
...
一个表达式什么都不表示当且仅当是方法调用 (§15.12)调用不返回值的方法,即, 声明为void(第8.4节)的方法。