This is an excerpt from the Scala Cookbook (partially modified for the internet). This is Recipe 17.3, “How to use @SerialVersionUID and other Scala annotations.”
Problem
You want to specify that a Scala class is serializable, and set the serialVersionUID
. More generally, you want to know the syntax for using annotations in your Scala code, and know which annotations are available.
Solution
Use the Scala @SerialVersionUID
annotation while also having your class extend the Serializable
trait:
@SerialVersionUID(1000L) class Foo extends Serializable { // class code here }
Note that Scala has a serializable
annotation, but it has been deprecated since version 2.9.0. The serializable
annotation Scaladoc includes the following note:
instead of @serializable class C, use class C extends Serializable
Discussion
In addition to the @SerialVersionUID
annotation and the Serializable
trait, Scala has other annotations that should be used for various purposes, including the cloneable
, remote
, transient
, and volatile
annotations. Based primarily on the “A Tour of Scala Annotations” web page, Table 17-3 shows a mapping of Scala annotations to their Java equivalents.
Table 17-3. Scala annotations and their Java equivalents
Scala | Java |
---|---|
scala.beans.BeanProperty | No equivalent. When added to a class field, it results in getter and setter methods being generated that match the JavaBean specification. |
scala.cloneable | java.lang.Cloneable |
scala.deprecated | java.lang.Deprecated |
scala.inline | Per the Scaladoc, @inline “requests that the compiler should try especially hard to inline the annotated method.” |
scala.native | The Java native keyword |
scala.remote | java.rmi.Remote |
scala.serializable | java.io.Serializable |
scala.SerialVersionUID | serialVersionUID field |
scala.throws | throws keyword |
scala.transient | transient keyword |
scala.unchecked | No equivalent. According to its Scaladoc, it designates that “the annotated entity should not be considered for additional compiler checks.” |
scala.annotation.varargs | Used on a field in a method, it instructs the compiler to generate a Java varargs-style parameter |
scala.volatile | volatile keyword |
As one example of these annotations, the current nightly version of the Scala Remote
Scaladoc states that the following Scala code and Java code are equivalent:
// scala @remote trait Hello { def sayHello(): String } // java public interface Hello extends java.rmi.Remote { String sayHello() throws java.rmi.RemoteException; }
Recipe 17.6, “When Java Code Requires JavaBeans” provides examples of the BeanProperty
annotation.
See Also
- The Serializable trait is deprecated
- “A Tour of Scala Annotations”
- Recipe 17.5 discusses the Scala @varargs annotation, and Recipe 17.6 discusses How to create JavaBeans in Scala
this post is sponsored by my books: | |||
#1 New Release |
FP Best Seller |
Learn Scala 3 |
Learn FP Fast |