Класс scala.annotation.elidable
Аннотация для методов, тела которых могут быть исключены из сгенерированного байткода компилятором.
Поведение зависит от передачи -Xelide-below <arg> в scalac. Вызовы методов, помеченных elidable (а также тело метода), будут пропущены в сгенерированном коде, если приоритет, заданный аннотацией, ниже приоритета, заданного в командной строке.
@elidable(123) // annotation priority scalac -Xelide-below 456 // command line priority
Вызов метода будет заменен выражением, зависящим от типа исключенного выражения. В порядке убывания приоритета:
Unit () Boolean false T <: AnyVal 0 T >: Null null T >: Nothing Predef.???
Полный пример:
import scala.annotation._, elidable._
object Test extends App {
def expensiveComputation(): Int = { Thread.sleep(1000) ; 172 }
@elidable(WARNING) def warning(msg: String) = println(msg)
@elidable(FINE) def debug(msg: String) = println(msg)
@elidable(FINE) def computedValue = expensiveComputation()
warning("Warning! Danger! Warning!")
debug("Debug! Danger! Debug!")
println("I computed a value: " + computedValue)
}
% scalac example.scala && scala Test
Warning! Danger! Warning!
Debug! Danger! Debug!
I computed a value: 172
// INFO lies between WARNING and FINE
% scalac -Xelide-below INFO example.scala && scala Test
Warning! Danger! Warning!
I computed a value: 0
Обратите внимание, что только конкретные методы могут быть помечены @elidable. Неаннотированный метод не исключается, даже если он переопределяет/реализует метод, имеющий аннотацию.
Также обратите внимание, что статический тип определяет, какие аннотации учитываются:
import scala.annotation._, elidable._
class C { @elidable(0) def f(): Unit = ??? }
object O extends C { override def f(): Unit = println("O.f") }
object Test extends App {
O.f() // not elided
(O: C).f() // elided if compiled with `-Xelide-below 1`
}
| Супертипы |
|---|
Конкретные поля
Исходный код
© 2002-2022 EPFL, with contributions from Lightbend.
Licensed under the Apache License, Version 2.0.
https://scala-lang.org/api/3.1.1/scala/annotation/elidable.html