2016-12-12 6 views
1

Я относительно новичок в 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 можно:

  1. Disallow добавление var -s к object

OR

  1. Disallow добавление как val -s и var -s к object

с ключевым словом или аннотацию любого рода. Или можно добиться этого с помощью макросов или метапрограмм, если Scala не поддерживает его из коробки?

+0

Может быть, «вал»? Я согласен с @Pavel –

+0

Вы правы. Бесполезный комментарий:/sorry:/ –

+1

Возможно, есть некоторые инструменты статического анализа, которые делают это, но это не относится к StackOverflow. Как правило, способ избежать таких ошибок обычно осуществляется через процесс проверки кода. Я не вижу, как вы можете полностью защищать любой код от будущих разработчиков. –

ответ

1

WartRemover. Для этого нет встроенной проверки (кроме той, которая запрещает все использование var), но не должно быть сложно написать один (и включить изменчивую коллекцию val с, пока вы на ней). В качестве альтернативы, если вы хотите только отметить определенные объекты как неизменные, то macro annotation будет использовать в основном тот же код.

+0

Я закончил тем, что запретил «var'-s в [ScalaStyle] (http://www.scalastyle.org/) checker, поскольку один из них уже был настроен для проекта. – Mike

 Смежные вопросы

  • Нет связанных вопросов^_^