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

时间:2016-12-12 13:47:51

标签: scala immutability

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

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

我想暂时保护它,并且需要将对象标记为不保持(可变)状态,以便编辑器或某些验证工具(例如Fortify)在有人尝试向对象添加状态时引发错误。 Scala有可能吗?是否有@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
  2. OR

    1. 禁止将val - 和var - s添加到object
    2. 包含任何类型的关键字或注释。或者,如果Scala不支持开箱即用,可以通过宏或元编程实现这一目标吗?

1 个答案:

答案 0 :(得分:1)

使用WartRemover。没有内置的检查(除了禁止所有使用var),但它不应该写一个(并包括可变集合{{ 1}}当你在它的时候)。或者,如果您只想将特定对象标记为不可变,则macro annotation将采用基本相同的代码。