我正在阅读kafka.core.log.LogSegment类的源代码。 Scala的语法给我带来极大的困惑。我知道我是否可以系统地学习scala就可以弄清楚了,但是自从我的项目等待以来,我只是没有那么多时间。
方法的定义:
@volatile private var _maxTimestampSoFar: Option[Long] = None//**#pos 0 constructor??**
def maxTimestampSoFar_=(timestamp: Long): Unit = _maxTimestampSoFar = Some(timestamp)//**definition 1**
def maxTimestampSoFar: Long = {//**definition2**
if (_maxTimestampSoFar.isEmpty)
_maxTimestampSoFar = Some(timeIndex.lastEntry.timestamp)
_maxTimestampSoFar.get
}
它们在哪里:
if (largestTimestamp > maxTimestampSoFar) {//**#pos 3.getter**
maxTimestampSoFar = largestTimestamp//**#pos4 set the value?**
offsetOfMaxTimestampSoFar = shallowOffsetOfMaxTimestamp
}
令我感到困惑的结论如下:
maxTimestampSoFar_
后面带有一个额外的“ _”,这种方法的用法是什么。当我检查定义1和定义2的用法时,出现重叠,从中可以得出结论,它们像过载双胞胎一样被视为相同的方法?但是由于它们具有不同的参数,为什么我们需要标识符有所不同?希望任何人都可以帮助我。对此表示赞赏。
maxTimestampSoFar_=
也是如此。这就是在Scala中定义设置器的方式(请参阅Scala getters/setters - best practice?)Option[Long]
可以包含None
或Some(<long value>)
,代码中的pos 0初始化值为None
的变量