为了账号安全,请及时绑定邮箱和手机立即绑定

赋值不返回 void

赋值不返回 void

HUH函数 2021-10-20 16:01:23
我在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;

}


查看完整回答
反对 回复 2021-10-20
?
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 节)时,表达式不表示任何内容。


查看完整回答
反对 回复 2021-10-20
  • 2 回答
  • 0 关注
  • 163 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信