Fields annotated @scala.static are generated as static fields.
The this identifier is not in scope in static field initialization expressions.
A static field x defined in a class C can be referenced as scala.static[C].x.
If the field is variable, it can be updated as scala.static[C].x = t.
A static field y defined in a singleton object C can be directly referenced as C.x and updated as C.x = t.
Some JVM frameworks require classes to have specific static fields.
For example, classes extending android.os.Parcelable are required to have a static field named CREATOR of type android.os.Parcelable$Creator.
Another example is using an AtomicReferenceFieldUpdater.
Field intialization expressions of static fields are added to the static initializer of the class (or the module class for static fields in objects).
The static[C] accessor can be implemented with scala.Dynamic, here's a sketch:
package scala
import scala.language.dynamics
class static extends annotation.StaticAnnotation
object static {
object StaticSelection extends Dynamic {
def selectDynamic(name: String) = ??? // intercepted by the compiler
def updateDynamic(name: String)(args: Any*) = ??? // me too
}
def apply[T: reflect.ClassTag] = StaticSelection
}- Can arbitrary (nested) classes and objects have static fields?
- Feature interaction: serialization (
readResolveof modules)
- SI-4581 is a request for a
@staticannotation - #894 added the annotation, but was reverted in #1340.
- This implementation was different: only fields in objects could be annotated
@static. The static field was generated in the companion class (not in the module class).
- This implementation was different: only fields in objects could be annotated
- A few bugs that showed up in the previous implementation (good test cases): SI-6189, SI-6236, SI-6294
class C {
@static var x = 0
def inc = {
static[C].x += 1
static[C].x
}
}Generated pseudo-bytecode:
class C {
static x: int
method <clinit>: void = {
setstatic x 0
}
method inc: int = {
setstatic x ((getsatic x) + 1)
getstatic x
}
}