有没有办法将 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 中是否可以:
- 不允许将
var
-s 添加到 object
或
- 不允许将
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 val
s while you are at it). Alternately, if you only want to mark specific objects as immutable, a macro annotation将采用基本相同的代码。
我对 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 中是否可以:
- 不允许将
var
-s 添加到object
或
- 不允许将
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 val
s while you are at it). Alternately, if you only want to mark specific objects as immutable, a macro annotation将采用基本相同的代码。