【问题标题】:What are Scala annotations actually? [closed]Scala 注解实际上是什么? [关闭]
【发布时间】:2013-05-26 03:24:28
【问题描述】:

不懂Java,开始学Scala。什么是注解,它们有什么用?

【问题讨论】:

    标签: scala annotations


    【解决方案1】:

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

    常见用途包括:

    1. 将方法标记为单元测试方法和相关的设置/拆卸(例如 JUnit 和 TestNG)
    2. 为持久性标记类和字段(例如 Hibernate)
    3. 标记要公开为 JMX bean 的类和字段

      注解是 Java 的一个特性,因此在 Scala 和 Java 中都可用。

    【讨论】:

    • 可以肯定的是,注释是 JVM 支持的 Java 特性,但这并不能使它们自动成为 Scala 的一部分。
    • 特别是,因为您可以在 Scala 中注释您不能在 Java 中注释的东西,或者甚至存在在 Java 中,我很确定 Scala Annotations 不仅仅是简单的 1:1 映射到 Java Annotations 或 JVM Annotations。
    • 我并没有断言存在一对一的映射。但是我说 Java 注解在 JVM 中受支持并且在 Scala 中可用。以上所有都属于这一类。
    【解决方案2】:

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

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

    这里,@SuppressWarnings 注释告诉编译器不要发出关于 useADeprecatedMethod's 使用 someDeprecatedMethod 的警告。

    Java 世界中的其他用途包括向类添加有关它如何映射到关系数据库以供 OR 映射器(如 Hibernate)使用的信息。

    在 Scala 中,许多在 Java 中是关键字或标记接口的东西在 Scala 中被实现为注解。例如@throws@serializable

    下面是一个示例,显示了 Scala 和 Java 在注释的帮助下协同工作。想象一下,我们要在 Scala 中定义一个 Person 类。当我们在 Java 中使用 Person 时,Java 程序员会期望我们有 setNamegetName 方法,这是 Java 中的 bean 约定。这可以使用 @BeanProperty 注释来实现:

    Scala 中的 Person 类:

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

    在爪哇中:

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

    【讨论】:

      【解决方案3】:

      Java 注释的一个有趣方面是控制它们的保留.定义注解类型(实现 Annotation 接口的 Java 类)时,其属性之一是其 RetentionPolicy,其中之一:

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

      【讨论】:

        猜你喜欢
        • 2021-04-07
        • 2015-03-21
        • 2015-04-15
        • 1970-01-01
        • 2010-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多