Я относительно новичок в Scala. У меня есть несколько вспомогательных методов и их нужно разместить где-нибудь. Мой инстинкт - группировать вспомогательные методы в апатриде object
.Есть ли способ отмечать объект в Scala, поскольку он не поддерживает переменное состояние?
Относительно того, что я или кто-то еще мог начать добавлять состояние к этому объекту с полями 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
}
Update: согласно дискуссии в комментариях, я интересно узнать, как в Scala можно:
- Disallow добавление
var
-s кobject
OR
- Disallow добавление как
val
-s иvar
-s кobject
с ключевым словом или аннотацию любого рода. Или можно добиться этого с помощью макросов или метапрограмм, если Scala не поддерживает его из коробки?
Может быть, «вал»? Я согласен с @Pavel –
Вы правы. Бесполезный комментарий:/sorry:/ –
Возможно, есть некоторые инструменты статического анализа, которые делают это, но это не относится к StackOverflow. Как правило, способ избежать таких ошибок обычно осуществляется через процесс проверки кода. Я не вижу, как вы можете полностью защищать любой код от будущих разработчиков. –