Подтвердить что ты не робот

Что такое scala альтернатива сохраненным аннотациям

Я просто понял, что не могу иметь аннотации в scala, которые сохраняются и анализируются во время выполнения. Я также проверил этот вопрос, но я не совсем понял, каковы альтернативы.

  • DI - в ответе упоминается, что нет необходимости в каркасе DI в scala. Хотя это может иметь место на базовом уровне (хотя мне не очень понравился этот пример, какой идиоматический способ обработки DI?), Рамки Java DI, такие как spring, довольно продвинутые и обрабатывают многие вещи, такие как запланированные задания, кеширование, управляемое постоянство и т.д., Через аннотации, а иногда и пользовательские.

  • ORM - я признаю, что не пробовал какой-либо собственный scala ORM, но из того, что я вижу в squeryl, он также использует некоторые аннотации, то есть они неизбежны?

    /li >
  • любой инструмент сериализации - как вы идиоматически настраиваете вывод сериализации на JSON/XML/...?

  • Рамки веб-сервисов - как вы определяете (в коде) сопоставления, заголовки и т.д. для служб RESTful или SOAP?

Scala пользователям нужен гибридный проект scala/java (для аннотаций), чтобы использовать эти средства, которые поступают из Java?

И являются ли родные альтернативы scala для метаданных более приятными, чем аннотации? Я еще не полностью в режиме мышления scala, поэтому большинство примеров выглядят уродливо для меня, по сравнению с использованием аннотаций, поэтому, пожалуйста, постарайтесь быть более убедительными:)

4b9b3361

Ответ 1

Собственно, Scala имеет аннотации, сохраненные во время выполнения. Разница в том, что они не хранятся в виде аннотаций Java, а кодируются внутри содержимого двоичной ScalaSignature аннотации (которая сама по себе является аннотацией Java, сохраненной во время выполнения).

Итак, аннотации Scala можно получить во время выполнения, но вместо использования отражения Java необходимо использовать Scala отражение:

class Awesome extends StaticAnnotation

@Awesome
class AwesomeClass

import scala.reflect.runtime.universe._

val clazz = classOf[AwesomeClass]
val mirror = runtimeMirror(clazz.getClassLoader)
val symbol = mirror.classSymbol(clazz)
println(symbol.annotations) // prints 'List(Awesome)'

К сожалению, отражение Scala по-прежнему отмечено как экспериментальное и на данный момент неустойчиво (SI-6240 или SI-6826 являются примерами довольно серьезных проблем). Тем не менее, это кажется наиболее простой заменой для отражения Java и аннотаций в долгосрочной перспективе.

На данный момент нужно использовать аннотации Java, которые, по моему мнению, по-прежнему являются хорошим решением.

В отношении фреймворков и библиотек для DI/ORM/WS/сериализации - Scala по-прежнему не кажется зрелым в этой области, по крайней мере, не в Java. Есть много текущих проектов, направленных на решение этих проблем, некоторые из них уже очень хороши, другие все еще находятся в разработке. Чтобы назвать некоторые из них, которые приходят мне на ум: Squeryl, Slick, Spray, Pickling.

Кроме того, Scala имеет некоторые дополнительные функции, которые часто делают аннотации ненужными. В качестве примера можно привести Typeclasses (реализованные с неявными параметрами).