本文阅读目录
- 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.
要点如下:
- FINAL 只用于 ABAP 面向对象的编程范式。
- 一个类如果被标注为 final,则无法被继承,即无法拥有子类。
- 一个类的方法如果被标注为 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