返回介绍

数学基础

统计学习

深度学习

工具

Scala

三、注解

发布于 2023-07-17 23:38:22 字数 2452 浏览 0 评论 0 收藏 0

  1. 有一些注解编译器在针对Java 平台编译时会产生额外的信息。当编译器看到这样的注解时,它会首先根据一般的 scala 原则去处理,然后针对 scala 做一些额外的工作。

    • deprecated:对于任何标记为 @deprecated 的方法或类,编译器会为产出的代码添加 Java 自己的过期注解。因此 Java 编译器能够在 Java 代码访问过期 scala 方法时给出过期告警。

    • volatilescala 中标记为 @volative 的字段会在产出的代码中添加javavolative 修饰符。因此 scala 中的 volatile 字段和 java 的处理机制完全一致。

    • 序列化:scala 中的三个标准序列化注解全部都被翻译成 Java 中对应的语法结构。

      • 标记为@serializable 的类会被加上 JavaSeriablizable 接口。

      • @serialVersion UID(1234>) 会被转换成如下的 Java 字段定义:

        
        
        xxxxxxxxxx
        private final static long SerialVersionUID = 1234L
      • 标记为 @transient 的变量会被加上 Javatransient 修饰符。

  2. scala 并不检查抛出的异常是否被代码捕获。也就是说:Scala 的方法并没有与 Javathrows 声明相对应的定义。所有 Scala 方法都被翻译成没有声明任何抛出异常的 Java 方法。

    scala 之所以这么做,是因为在 java 中人们对于 throws 声明的体验并不全是正面的。很多开发者为了能够通过编译,直接在代码里吃掉并丢弃异常处理的代码。他们可能也想在之后强化异常处理的逻辑,但是经验表明:由于时间压力,大多数程序员几乎从来不会回过头来增加正确的异常处理。这样带来的扭曲的结果就是这个本意很好的特性成为了负担。

    因此,大量生产环境下的 Java 代码都吃掉并隐藏了运行期的异常,仅仅是为了让编译器通过而已。

    如果你希望在 scala 中开启异常,则可以使用 @throws 注解来标注你的方法:

    
    
    xxxxxxxxxx
    class A(name: String){ ... @throws(classOf[IOException]) // 翻译成 java 的 throws 声明 def read() = ... }
  3. Java 框架中的注解可以直接在 Scala 代码中使用,任何Java 框架都可以看到你编写的注解,就好像你是用 Java 编写的一样。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文