很多朋友对 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 时,就能优先把这些不可变变量排除在外。

  • 13
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值