Почему людям с scala не нравятся аннотации? - PullRequest
23 голосов
/ 23 декабря 2011

Атрибут в .NET - очень популярная функция.В Java добавлены аннотации после 1,5 Аннотации используются повсеместно, см. Java EE и Spring.Но немногие библиотеки Scala используют аннотации.Лифт-JSON не используйте его.Лифт-запись не используйте его.Скверил не используй это.subcut не использует его (он имеет аннотацию для плагина компилятора) ... Просто назвал несколько.

Они используют аннотацию только тогда, когда им нужна магия компилятора.@tailrec, @inline, @BeanProperty, @Inject (в подрезке) ...

Scala обладает сверхгибкой системой типов, trait, implicit и Menifest [X].Таким образом, им не нужны метаданные времени выполнения?

Есть ли какие-либо аннотации в проектах scala, сильно используемые?

ps Я думаю, Dynamic должна быть аннотацией, а не чертой.

Ответы [ 4 ]

28 голосов
/ 23 декабря 2011

Как правило, мы не используем аннотации, потому что на самом деле нам не нужно для многих вещей.

Несколько мест, где я видел аннотации:

  • Системы дополнительных типов (например, плагин CPS для продолжений с разделителями или плагин отслеживания эффектов.
  • Взаимодействие с унаследованными интерфейсами Java. (* 1 010 * Scala-мохо-поддержка )
  • Включение / включение оптимизации компилятора, например @inline или @tailrec.

В Scala нам на самом деле не нужна среда внедрения зависимостей, поскольку есть несколько способов сделать внедрение зависимостей, для которых не требуется внешний инструмент. Вы можете настроить DI-конфигурацию отдельно от кода ядра, но все равно писать в Scala. Смотри: https://github.com/jsuereth/scala-in-depth-source/blob/master/chapter11/src/main/scala/scalax/config/Test.scala

Итак, основной ответ: в аннотациях нет ничего плохого, мы просто не нуждаемся в них часто (пока).

13 голосов
/ 23 декабря 2011

Для меня это часто проблема безопасности типов с применением компилятора.Взгляните на Squeryl и на то, чем он отличается от Java ORM, такого как Hibernate.Когда Hibernate будет использовать аннотацию @Id для обозначения первичного ключа, в Squeryl вы создаете элемент id, который определяется признаком KeyedEntity.Методы, которым требуется объект с первичным ключом (например, update & delete), будут громко зависать во время компиляции, если он не был определен.В Squeryl есть несколько других мест, где типизированные безопасные конструкции заменяют аннотации, такие как отображение коллекций и обработка даты / времени.

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

2 голосов
/ 23 декабря 2011

Вы в значительной степени ответили на свой вопрос, когда сказали, что они используются для магии компилятора. Для других применений это обычно какая-то магия времени выполнения, где два основных инструмента - это отражение и преобразование байтового кода.

Для случая JSON варианты преобразования будут следующими: 1. Функция или класс, который анализирует ваше JValue и создает ваш класс T. 2. Отражение над целевыми классами, чтобы определить их макет и что необязательно, затем какой-то «динамический» код, который запускается над этими проанализированными данными, чтобы создать и затем в конечном итоге привести к соответствующему типу.

0 голосов
/ 24 июня 2016

Все аннотации, такие как @tailrec и @inline, только во время компиляции. Они расширяют StaticAnnotation, которая является AFAIK, единственной поддержкой аннотаций в Scala, и они не будут сохраняться во время выполнения. Я думаю, что философия состоит в том, чтобы избегать аннотаций во время выполнения, потому что они извлекаются посредством отражения, в мире, где компилятор больше не может помочь вам за пределами стандартных классов из-за стирания типов, но самое главное, потому что это время выполнения и цель это решить, что вы пытаетесь решить во время компиляции.

Посмотрите на использование аннотаций для моделирования вывода JSON, например: В Java вы будете знать, работает ли он нормально при запуске вашей программы. В Scala вы можете использовать классы типов для моделирования того, как каждый тип выражается в JSON. Если вы пропустите одно определение, компиляция скажет вам. Отличным примером является Spray-JSON .

Дейв Уиттакер приводит еще один замечательный пример в своем ответе .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...