当前位置: 首页 > news >正文

Scala学习笔记16: 注解

目录

    • 第十六章 注解
      • 1- 常见的Scala注解
        • 1.1 标准注解
        • 1.2 Java注释
      • 2- 自定义注解
      • 3- 注解的使用场景
          • 3.1 编译时处理
          • 3.2 运行时反射
      • 4- 注解参数
      • end

第十六章 注解

Scala 中的注解 (Annotations) 是一种元编程工具, 用于向编译器、运行时或其他工具提供元数据 ;

注解可以应用于各种程序结构, 包括类、对象、方法、字段、参数等 ;

下面是对Scala注解的详细介绍, 包括常见的注解、如何定义自定义注解, 以及使用注解的一些示例 ;

1- 常见的Scala注解

1.1 标准注解
  • @deprecated: 标记某个代码元素为过时 ;

  • // 标记某个代码元素为过时
    @deprecated("This method is deprecated, use another method instead", "1.0")
    def oldMethod(): Unit = {println("This is an old method")
    }
    
  • @unchecked: 忽略某些编译器警告, 例如模式匹配中的警告 ;

  •     val x: Any = "Hello"val y = x match {case _: Int => "Integer"case _@unchecked => "Other"}println(y) // Output: Other
    
  • @tailrec: 确保方法是尾递归的, 否则编译器会报错

  • import scala.annotation.tailrec@tailrecdef factorial(n: Int, acc: Int = 1): Int = {if (n <= 0) accelse factorial(n - 1, acc * n)}
    
  • @volatile: 标记某个变量为可变变量, 确保在多线程环境下, 变量在每个线程中都有一份独立的拷贝

  • @volatile var count: Int = 0
    
  • @SerialVersionUID: 指定序列化版本号, 确保反序列化时, 使用正确的版本号

  •     @SerialVersionUID(1L)class Person(val name: String, val age: Int) extends Serializable
    
1.2 Java注释

Scala 也支持 Java 注释, 可以直接在 Scala 代码中使用 Java 注释 ;

示例 :

import com.sun.istack.internal.Nullabledef main(args: Array[String]): Unit = {// java 注释class Example {def method(@Nullable param: String): Unit = {println(param)}}val example = new Example()example.method(null) // Output: nullexample.method("Hello") // Output: Hello}

2- 自定义注解

你可以通过定义类并扩展 scala.annotation.Annotation 来创建自定义注解 ;

import scala.annotation.StaticAnnotation// 自定义注解class myAnnotation(message: String) extends StaticAnnotation@myAnnotation("This is a custom annotation")def myMethod(): Unit = {println("This is a method with a custom annotation")}

3- 注解的使用场景

3.1 编译时处理

某些注解可以在编译时被编译器处理, 提供警告或优化 ;

  @deprecated("This method is deprecated, use another method instead", "1.0")def oldMethod(): Unit = {println("This is an old method")}
3.2 运行时反射

可以在运行时通过反射读取注解信息

import scala.annotation.StaticAnnotation
import scala.reflect.runtime.universe._// 定义自定义注解
case class MyAnnotation(message: String) extends StaticAnnotation// 应用自定义注解到类上
@MyAnnotation("This is an example class")
class Exampleobject AnnotationReader {// 获取类上的注解信息def getClassAnnotations[T: TypeTag]: List[Annotation] = {val tpe = typeOf[T]tpe.typeSymbol.annotations}// 打印注解信息def printAnnotations[T: TypeTag](): Unit = {val annotations = getClassAnnotations[T]annotations.foreach { annotation =>println(s"Annotation: ${annotation.toString}")annotation.tree.children.tail.foreach { arg =>println(s" - Argument: ${arg.toString}")}}}
}object Main extends App {// 读取并打印 Example 类上的注解信息AnnotationReader.printAnnotations[Example]()
}

4- 注解参数

在Scala中, 注解(Annotation) 就像标签一样, 可以附加到类、方法、字段等代码元素上, 为他们添加额外的信息 ;

而注解参数, 顾名思义, 就是可以在使用注解时, 像函数调用一样传入一些信息, 用于制定注解的行为 ;

Scala注解参数支持多种数据类型, 包括:

  • 基本数据类型: 例如 IntDoubleBooleanString 等 ;
  • 数组: 例如 Array[Int]Array[String] 等 ;
  • 类实例: 可以传入自定义的类, 或者 Scala/Java 标准库中的类 ;
  • 枚举值: 可以传入定义好的枚举类型的值 ;

end

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • ‍我想我大抵是疯了,我喜欢上了写单元测试
  • 根据视图矩阵, 恢复相机的世界空间的位置
  • Elasticsearch 企业级实战 01:Painless 脚本如何调试?
  • OPPO 2024届校招正式批笔试题-后端(C卷)
  • LLM基础模型系列:Prompt-Tuning
  • 前端实现将多个页面导出为pdf(分页)
  • SSL vpn easy connect 选路连接失败,可能当前连接网络异常,请稍后重试
  • 防火墙--双机热备
  • python + Pytest + requests 的接口自动化步骤
  • SQL基础 | NOT NULL 约束介绍
  • 7.13实训日志
  • Qt易错总结
  • Chrome浏览器的Profile数据内容简介
  • 一边吃谷一边痛,二次元距离三次元还有多远?
  • 电视盒子变身NAS之安装termux
  • 【Leetcode】101. 对称二叉树
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • 【附node操作实例】redis简明入门系列—字符串类型
  • 4个实用的微服务测试策略
  • Android交互
  • Android框架之Volley
  • AngularJS指令开发(1)——参数详解
  • ES学习笔记(12)--Symbol
  • jquery cookie
  • js递归,无限分级树形折叠菜单
  • Magento 1.x 中文订单打印乱码
  • MYSQL 的 IF 函数
  • Odoo domain写法及运用
  • Puppeteer:浏览器控制器
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • Redash本地开发环境搭建
  • scala基础语法(二)
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • 工作中总结前端开发流程--vue项目
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 扩展资源服务器解决oauth2 性能瓶颈
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • ​字​节​一​面​
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (pytorch进阶之路)扩散概率模型
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (附源码)ssm失物招领系统 毕业设计 182317
  • (计算机网络)物理层
  • (接口自动化)Python3操作MySQL数据库
  • (论文阅读30/100)Convolutional Pose Machines
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (三分钟)速览传统边缘检测算子
  • (算法)区间调度问题
  • (五)Python 垃圾回收机制
  • (译)2019年前端性能优化清单 — 下篇
  • (原创)可支持最大高度的NestedScrollView
  • (转)Google的Objective-C编码规范