有没有办法将 Scala 中的对象标记为不保持可变状态?

Is there a way to mark object in Scala as not holding mutable state?

我对 Scala 比较陌生。我有几个辅助方法,需要将它们放在某个地方。我的直觉是将辅助方法分组为无状态 object.

然而,我或其他人可能会开始使用 var 字段向该对象添加状态,这令人担忧。这将导致副作用,不仅辅助方法的参数而且对象的状态都会影响方法的行为。

我现在想对此进行保护,并且需要将对象标记为未保持(可变)状态,以便编译器或某些验证工具(例如 Fortify)会在有人尝试向对象添加状态时引发错误.在斯卡拉有可能吗?是否有一些 @Immutable@Stateless 注释?

示例代码:

object StreamHelpers /* <-- this needs to be marked immutable or stateless */ {

  var something: String = "change me" // <-- this should cause build to fail

  def streamToString(stream: InputStream): String = {
    managed(new InputStreamReader(stream, StandardCharsets.UTF_8))
      .map(reader => CharStreams.toString(reader)).getTry.get
  }

  // other stuff
}

更新:根据评论中的讨论,我很想知道在 Scala 中是否可以:

  1. 不允许将 var-s 添加到 object

  1. 不允许将 val-s 和 var-s 添加到 object

带有任何类型的关键字或注释。或者,如果 Scala 不支持开箱即用,是否可以通过宏或元编程来实现?

使用WartRemover. There is no built-in check for that (except one which bans all use of var), but it shouldn't be hard to write one (and include mutable collection vals while you are at it). Alternately, if you only want to mark specific objects as immutable, a macro annotation将采用基本相同的代码。