分配不会返回空

时间:2018-10-01 08:12:57

标签: java variable-assignment ternary-operator

我在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 个答案:

答案 0 :(得分:4)

  

我想念什么?

赋值表达式的结果就是所赋值的事实。 :-)因此,在该代码中,对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;
}

答案 1 :(得分:1)

赋值表达式varibale = value的评估结果为value,请尝试:

int a;
System.out.println(a = 1); // 1

所以等于:

if (result == null) {
    rowMap = createRowMap();
    return rowMap;
}

See jls for more:

  

对程序中的表达式求值(执行)时,结果   表示三件事之一:

     
      
  • 变量(第4.12节)(在C中,这称为左值)

  •   
  • 一个值(§4.2,§4.3)

  •   
  • 一无所有(该表达式被认为是无效的)

  •   
     

...

     

一个表达式什么都不表示当且仅当是方法调用   (§15.12)调用不返回值的方法,即,   声明为void(第8.4节)的方法。