首页 > 其他分享 >很多朋友对 ABAP 关键字 FINAL 的用法,只掌握了一半

很多朋友对 ABAP 关键字 FINAL 的用法,只掌握了一半

时间:2024-08-07 11:59:05浏览次数:11  
标签:变量 代码 关键字 ABAP 内联 声明 FINAL

本文阅读目录

  • FINAL 对 ABAP 类和方法意味着什么
  • 什么是变量的 Up-front 声明方式
  • 什么是变量的 Inline 声明方式
  • ABAP 757 对变量内联声明方式的进一步增强

笔者把之前的文章 SAP 某 ABAP 系统标准类中仅有 5.4% 公有属性被 READ-ONLY 修饰,原因竟然是…… 分享到我的 SAP 技术交流群之后,有朋友阅读之后,评论说和 Java 的 FINAL 关键字有点像。

其实 ABAP 里也存在 FINAL 关键字。只是大部分朋友对于 ABAP FINAL 关键字的用法,可能都只了解了其中一半的内容。

本文我们就来完成 ABAP FINAL 关键字的完整拼图。

ABAP 帮助文档里对 FINAL 的介绍言简意赅。

Term in ABAP Objects. A final class can not have any subsclasses. A final method cannot be redefined.

要点如下:

  1. FINAL 只用于 ABAP 面向对象的编程范式。
  2. 一个类如果被标注为 final,则无法被继承,即无法拥有子类。
  3. 一个类的方法如果被标注为 final,则该方法无法被子类重新实现。

下图是 ABAP SE24 里将类标注为 Final 的开关:

打开这个开关,对应 ABAP 类的源代码里的 FINAL 关键字,如下图第 3 行代码所示。

ABAP 类方法的 FINAL 开关,在方法的属性对话框里可以编辑:

勾上 FINAL 开关之后,对应方法的源代码里也会加上 FINAL 的修饰符,意味着该方法无法被子类所重定义。

通过将 ABAP 类或者方法标记为 FINAL,类的开发者明确传达出一种意图:这些元素不允许被继承或者重定义。开发者通过 FINAL 标志,防止子类或者重定义方法对父类核心行为进行修改,避免潜在的错误和不一致性。

以上是我们熟知的关于 FINAL 的知识点。

什么是变量的 Up-front 声明方式

FINAL 关键字的另一半作用,和 ABAP 内联声明 - Inline Declaration 有关。

ABAP 内联声明是 ABAP 740 引入的一个新的语言特性。

在传统的 ABAP 类或者 Function Module 内部,常常可以在代码的起始位置,看到下图这种大段大段的使用 DATA 关键字开头的变量声明语句。

在 SAP 官方文档中,这种传统的变量声明方式,称为 Up-front 声明方式。

Up-front 声明方式,在编程语言的早期历史发展阶段特别流行,尤其是在像 C 语言这样的传统编程语言中。其核心思想是,将所有需要的变量在函数、类方法等代码块的开始部分一次性声明,并且通常不在代码的中间部分引入新的变量。

Up-front 声明方式不仅明确且统一规定了变量的声明位置,还确保了变量在整个代码块中都是可用的。通过在代码的开头集中声明变量,开发者可以更清晰地了解程序所需的所有变量,并为变量的作用范围和类型提供统一的视角。

笔者之前的文章聊聊 C 语言和 ABAP 曾经介绍过,ABAP 的内核和虚拟机均使用 C 语言实现,因此 ABAP 诞生之初,其变量声明,理所当然沿用了 C 语言的 Up-front 声明方式。

Up-front 的声明方式,将所有变量的声明统一放置于代码块的起始位置。这种方式固然简单,但随着代码的规模扩大和功能的增加,代码的开头部分可能会变得非常冗长。

开发者需要在开头部分管理大量的变量声明,这可能增加代码的复杂性,并使得代码块的整体结构变得难以管理。

随着编程语言的发展和新特性的引入,现代编程语言逐渐倾向于更加灵活和动态的变量声明方式,即内联声明方式 - Inline Declaration.

什么是变量的内联声明方式

从 ABAP 740 开始,我们可以使用内联声明语法。

同 Up-front 声明方式相比,内联声明语法可以实现变量的随用随声明,因此更加灵活,有助于代码变得紧凑易读。

笔者的文章如何用工具检查 ABAP 代码是否符合 Clean ABAP 编码规范里提到的 Clean ABAP Style Guide,也旗帜鲜明地指出:优先使用内联声明方式,避免使用 Up-front 声明方式。

内联声明方式可以让变量的声明和使用(通常是变量的赋值操作)发生在同一行,同时省去了变量数据类型的声明工作。因为内联声明的变量数据类型,可以通过 ABAP 编译器智能地推断出来。

ABAP 757 对变量内联声明方式的进一步增强

在计算机编程语言中,immutable variable(直译为不可变的变量) 是指其状态在初始化后,无法被改变的变量。

不可变变量通常用于确保数据的安全性、简化并发编程,并提高程序的可预测性。

在函数式编程语言中,强调使用 immutable variable 和纯函数(即不会产生 side effect 副作用的函数),使程序更容易推理和测试。

在并发编程中,借助 immutable variable 的线程安全特性,多个线程可以安全地共享不可变变量,而无需担心数据竞争或锁的问题。

因此不可变变量广泛应用于 Java 和 Scala 这种支持函数式编程和多线程编程的应用开发中。至于 ABAP 应用开发,通常不会有函数式编程等技术需求,所以直到 757 这个版本,才引入了对 immutable variable 的支持。

ABAP 帮助文档里给出了使用 FINAL 来声明不可变变量的一些例子:

https://help.sap.com/doc/abapdocu_757_index_htm/7.57/en-US/index.htm?file=abenfinal_inline.htm

可以看出 FINAL 不仅能用来声明普通 ABAP 语句里的变量,也能用在 OPEN SQL 语句中。下图第二个例子,使用 FINAL 声明了一个不可变变量 result. 这个内表一经填充,在其后的 LOOP 操作中,内容就不允许修改,否则会引起语法错误。

SELECT carrid, connid, seatsocc
       FROM sflight
       WHERE fldate = @yesterday
       INTO TABLE @final(result).

LOOP AT result INTO FINAL(wa).
  ...
  "不可变变量的内容不允许修改,否则会产生语法错误
  "wa-seatsocc = 0. 
  ...
ENDLOOP.

"不可变变量的内容不允许修改,否则会产生语法错误
"APPEND wa TO result.

虽然 ABAP 应用开发中,不会使用到函数式编程等理念,但合理使用 FINAL 关键字将变量声明为不可变变量,有助于提高代码的可读性。

代码阅读者看到变量声明前的 FINAL 关键字,脑子就能立即意识到,这个变量的内容,在此处进行初始化之后,在余下整个应用的生命周期里都不会再发生变化。

这样在分析一些因为数据修改造成的 bug 时,就能优先把这些不可变变量排除在外。

标签:变量,代码,关键字,ABAP,内联,声明,FINAL
From: https://blog.csdn.net/m0_55213370/article/details/140988108

相关文章

  • ORACLE 查询条件出现关键字:&
    SQLselect1fromdualWHERExxxIN('AAA&SSS')编译器提示原因和解决方法在OracleSQL查询中,‌如果查询条件包含特殊字符如&,‌通常需要进行转义处理,‌以确保查询语句能被正确解析&在Oracle中可能被视作替换变量的一部分,‌因此直接使用时可能导致查询出错为了正常查询......
  • 【多线程-从零开始-伍】volatile关键字和内存可见性问题
    volatile关键字importjava.util.Scanner;publicclassDemo2{privatestaticintn=0;publicstaticvoidmain(String[]args){Threadt1=newThread(()->{while(n==0){//啥都不写......
  • Jave-this关键字
    目录1.this关键字先看一段代码,并分析问题 什么是this案例演示 2.this的注意事项和使用细节1.this关键字先看一段代码,并分析问题 什么是this this就代表的是当前对象。this可以大概理解成“我的” ,比如我的书包,这里的“我的”就代表当前对象。this是一个......
  • 织梦dede怎么修改关键字长度?
    dede文件修改默认关键字长度第1步:找到并打开dede后台目录下的article_edit.php和article_add.php文件。电脑维修技术网注:如果是修改专题认关键字的话,需要修改spec_add.php和spec_edit.php文件。第2步:在文件中搜索"keywords",找到“$keywords=trim(cn_substrR($keywords,60));......
  • ABAP 宿主表达式(Host Expressions)
    ABAP宿主表达式是一种在ABAP7.40及更高版本中引入的特性,‌它允许在SQL表达式的操作数位置或编写SQL语句的工作区中使用任何ABAP表达式。‌ 这种表达式通过在表达式前加上@符号来标识,‌形式为@(abap_expression)。‌宿主表达式的引入,‌使得ABAP开发者能够更灵活地在SQL查询中使用......
  • 【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值
    C++语法相关知识点可以通过点击以下链接进行学习一起加油!命名空间缺省参数与函数重载本章将分享C++增加的几种常见特性,主要内容为引用与内联函数|auto关键字与for循环|指针空值,这些知识看似很多,实际也不少。本章篇幅长,耐心享用,若有不足,欢迎指出!......
  • interface关键字 day09
    /*java提供了一个关键字:interface,用来定义一个接口接口的主要作用是用来描述类的额外功能的。定义一个接口的语句定义格式:interface接口名{}需求:定义一个普通的狗类,和一个会骑车的狗类使用接口的注意事项:1、接口中只能出现抽象......
  • JavaScript(二十二)——JavaScript this 关键字
    目录方法中的this单独使用this函数中使用this(默认)函数中使用this(严格模式)事件中的this对象方法中绑定显式函数绑定面向对象语言中this表示当前对象的一个引用。但在JavaScript中this不是固定不变的,它会随着执行环境的改变而改变。在方法中,this表示该方......
  • abstract关键字以及与public,final,static的关系 day09
    多态程序中,第一大前提要有继承关系。但是呢,比如上午写的动物案例,我们将狗,猫,猪这些具体的动物分别编写了一个类进行对应这都是没问题的。但是呢,动物本身应该是一个抽象的概念,我们在现实生活中其实是找到不到Animal的实例的。具体的事物,我们就可以使用java代码......
  • FinalShell远程连接centos7
    一.引言我们在VMware中安装好centos7版本的Linux后,经常需要在虚拟机和真实机之间来回切换,特别是要上传文件到centos7中的时候,很不方便。因此我们可以通过FinalShell软件来远程连接到centos7,FinalShell支持多标签页功能,用户可以同时打开多个连接,并在不同的标签页中切换,提高了工......