Scala注释示例
Scala注释是添加到程序源代码中的元数据或者其他信息。
像注释一样,注释可以附加到变量,方法,表达式或者任何其他程序元素上。
允许在任何种类的定义或者声明中使用注释,包括var,val,类,对象,特征,def和类型。
声明注释的语法可以是以下形式:
@annot(exp_{1}, exp_{2}, ...) {val name_{1}=const_{1}, ..., val name_{n}=const_{n}}
" annot"指定注释的类别,并且所有注释都必须包含该注释。
一些注释可能不需要任何参数,因此可以排除括号或者可以使用空()。
赋予注释的参数的精确形式尤其取决于注释类。
大多数注释处理器都允许使用即时常量,例如" Hi",678等。
关键字" this"可用于引用范围中的其他变量。
" name = const"可用于具有可选参数的更复杂的注释。
这些参数是可选的,可以按任何顺序指定。
等号后的右侧值建议为常数。
Scala标准注释
Scala有几个标准注释。
他们是;
scala.SerialVersionUID→此注释指定可序列化类的静态SerialVersionUID字段。
scala.deprecated→此注释告诉您定义已删除。
scala.volatile→此注释允许程序员在并发程序中使用可变状态。
scala.transient→此注释将字段标记为非持久性。
scala.throws→此注释指定方法抛出的异常。
scala.cloneable→此批注指定将其应用为可克隆的类
scala.native→此注释是本机方法的标记。
scala.inline→在方法上的此注释要求编译器应尽量内联已注释的方法。
scala.remote→此批注指定将其应用为可远程处理的类。
scala.serializable→此批注指定将其应用为可序列化的类
scala.unchecked→此注释将应用于匹配表达式中的选择器。
如果存在,则将禁止该表达式的穷举性警告。
scala.reflectBeanProperty→当附加到字段时,此注释将遵循JavaBean约定添加getter和setter方法。
我们来看一些带有示例的注释。
弃用注释
产生了编写以后使用不需要的类或者方法的需要。
弃用允许我们在不希望其他人使用的方法或者类中添加通知,但为了向后兼容而不能删除。
该方法或者类可以标记为@deprecated,以便在其他人尝试使用此方法或者类时显示弃用警告。
例如,如下创建一个Scala对象。
scala.scala
package com.annotations import scala.deprecated; object Deprecation1 { @deprecated def printMessage() = { println("This method is deprecated") } def main(args: Array[String]) { printMessage() } }
方法printMessage被标记为已弃用。
每当Scala代码访问主程序中的printMessage方法时,Scala编译器都会发出弃用警告,如下图所示。
挥发性领域
有时程序员希望在并发程序中使用可变状态。
@volatile注释在这种情况下有帮助,并通知编译器该变量将被多个线程使用。
@volatile关键字在不同的平台(例如Java平台)上提供不同的保证,但是,您得到的行为与用Java代码编写该字段并用Java volatile修饰符标记该字段的行为相同。
二进制序列化
序列化框架将对象转换为字节流,反之亦然,这在将对象保存到磁盘或者通过网络传输它们时很有用。
Scala没有自己的序列化框架,因此应使用基础框架。
" @serializable"注释指示类是否可序列化。
默认情况下,该类被视为不可序列化的,因此添加了@serializable注释。
@SerialVersionUID处理随着时间变化的可序列化类。
序列号可以作为@SerialVersionUID(678)附加到当前版本,其中678是序列号。
Scala为字段提供" @transient"注释。
如果将该字段标记为@transient,则即使序列化周围的对象,框架也不应保存该字段。
加载对象时,该字段将恢复为标为@transient的字段类型的默认值。
自动获取和设置方法
Scala提供了@ scala.reflect.BeanProperty注释,该注释将该注释添加到字段中,并且编译器会自动为该字段生成getter和setter方法。
例如–如果注释名为id的字段,则getter方法将命名为getId
,setter方法将命名为setId
。
getter和setter方法仅在编译过程完成后才可用。
Scala代码字段可以直接访问。
此功能旨在支持期望使用常规getter和setter方法并且不编译框架(同时使用该框架的代码)的框架。
例如,打开Scala IDE并按以下方式创建scala类:
Car.scala
package scala.annotations.car import scala.beans.BeanProperty class Car { @BeanProperty var cname = "Alto" @BeanProperty var cno = 67 }
我们使用@BeanProperty批注,该批注为属性cname和cno生成getter setter方法。
现在创建一个Java程序,并使用创建为的scala Car类
Bean.java
package com.annotations; import scala.annotations.car.*; public class Bean { public static void main(String[] args){ Car c = new Car(); System.out.println("Car Name:" +c.getCname()); System.out.println("Car Number: "+c.getCno()); } }
cname和cno的getter方法由scala @BeanProperty方法生成,可在Java程序中使用,如上面的类代码所示。
@unchecked
@unchecked注释由编译器在模式匹配期间解释。
它告诉编译器不要担心match表达式是否忽略了某些情况。