什么是Scala注释实际上?

问题描述:

我不懂Java,于是我开始学习Scala。什么是注释,它们的用途是什么?什么是Scala注释实际上?

注解是附加到类/方法/字段的元数据,框架可以使用它来确定围绕这些类/方法/字段的必需功能。

常见用途包括:

  1. 标记方法作为单元测试方法和相关联的建立/拆除(例如JUnit和TestNG的)
  2. 标记为持久类和字段(例如休眠)
  3. 标记类和字段作为JMX的豆

注解是一个Java功能,并作为斯卡拉等提供以及Java。

+0

注解是JVM中支持的Java特性,当然,但这并不会使它们自动成为Scala的一部分。 – 2010-06-20 14:56:30

+0

特别是,由于您可以在Scala中注释您无法用Java注释或者甚至不存在Java中的东西,所以我非常肯定Scala Annotations不仅仅是一种简单的1:1映射到Java注释或JVM注释。 – 2010-06-20 15:01:15

+0

我并没有断言有一对一的映射。但是我*说* JVM支持Java注释,并且可以在Scala中使用。以上所有内容都适用于该类别。 – 2010-06-20 16:23:39

注解通常可以使信息与定义相关联,例如,类,方法或变量的定义。注释可以被编译器使用或者被程序的其他部分访问,例如在Java中:

@SuppressWarnings("deprecation") 
void useADeprecatedMethod() { 
    someObj.someDeprecatedMethod(); 
} 

这里,@SuppressWarnings注释告诉编译器不会发出警告有关useADeprecatedMethod's使用someDeprecatedMethod

Java世界中的其他用途包括向类中添加信息,以了解它如何映射到关系数据库以供像Hibernate这样的OR映射器使用。

在Scala中,许多Java中的关键字或标记接口都是作为Scala中的注释实现的。例如@throws@serializable

下面是一个显示Scala和Java与注释帮助一起工作的示例。想象一下,我们将在Scala中定义一个Person类。当我们在Java中使用Person时,Java程序员会希望我们拥有setNamegetName方法,就像Java中的bean约定一样。

Person类Scala中:这可以通过使用@BeanProperty注解实现

class Person { 
    @BeanProperty 
    var name = "Joe Bloggs" 
} 

在Java:

public void printPerson(Person p) { 
    // Scala added the getName method for us 
    System.out.println(p.getName()); 
} 

一个Java注释的有趣的方面是对他们保留控制。当注释类型(实现Annotation接口的Java类)被定义,它的一个属性是其RetentionPolicy,之一:

  • SOURCE - 注解是由编译器被丢弃。
  • CLASS - 注解将被编译器记录在类文件中,但不需要在运行时由VM保留。
  • RUNTIME - 注解将被编译器记录在类文件中,并在运行时由VM保留,因此可以反射性地读取它们。