我在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。我错过了什么?

最佳答案

我错过了什么?


赋值表达式的结果就是所赋值的事实。 :-)因此,在该代码中,对createRowMap的调用结果分配给了rowMap,并作为rowMap函数的结果返回。就像:

a = b = 42;


...将b设置为42,然后将a设置为42b = 42分配的结果)。

效果与代码是这样写的相同:

public Map<R, Map<C, V>> rowMap() {
  Map<R, Map<C, V>> result = rowMap;
  if (result != null) {
    return result;
  }
  rowMap = createRowMap();
  return rowMap;
}

09-05 13:47