Scala 可选最佳实践

Scala Optional best practices

def canAppendOffset(offset: Long): Boolean = {
  toRelative(offset).isDefined
}

private def toRelative(offset: Long): Option[Int] = {
  val relativeOffset = offset - baseOffset
  if (relativeOffset < 0 || relativeOffset > Int.MaxValue) None
  else Some(relativeOffset.toInt)
}

当 运行 进入上述代码时,我感到困惑。来自 Kafka LogSegment 的代码。我想知道为什么我们在这里需要一个 Optional 而不是简单地 return canAppendOffset() 中的布尔值。在我看来,为什么我们需要创建一个 Optional 并访问一个记录我需要的布尔值的字段是不必要的。 我认为在软件设计方面必须有一些逻辑。谁能就在 Scala 中使用 Optional 的位置和原因提出任何建议?

这里似乎存在一些误解。

...create an Optional and access a field which records the boolean value...

这里没有字段。 isDefinedOption class 中的一个方法,用于测试此实例是 Some() 还是 None.

...why we need an Optional here rather than simply return a boolean in canAppendOffset().

但是 canAppendOffset() "simply return a Boolean"。 toRelative() "creates" 和 Option 之所以如此,是因为 应该 到 return 一个 "relative"从给定的偏移量来看,如果不可能得到有效结果,它实际上可能会失败。

所以它 return 是一个 Option[Int],从而告诉调用者,"Here's Some(relative) if it can be calculated from the given offset, but it's None if I can't calculate a good result for you."

It looks unnecessary to me why we need to create an Optional and access an field which records the boolean value I need.

我同意。 创建一个返回 Option[Int]toRelative 方法是有意义的,如果它被用在实际使用计算出的偏移量的其他地方。很可能此方法以前用于其他用例,并了解实际使用的相对偏移量。

如果你只想知道是否可以附加偏移量,你可以简化:

private def canAppendOffset(offset: Long): Boolean = {
  val relativeOffset = offset - baseOffset
  relativeOffset >= 0 && relativeOffset < Int.MaxValue
}