SAP ABAP里存在Java List这种集合工具类么?CL_OBJECT_COLLECTION了解一下

简介: SAP ABAP里存在Java List这种集合工具类么?CL_OBJECT_COLLECTION了解一下

Jerry以前在工作中交替做着ABAP和Java开发时,总是在使用一种语言时,怀念另一种语言的便利之处,比如用ABAP开发时,怀念Java里以List为代表的功能强大,使用方便的集合工具类。

image.png

List或许是众多Java初学者最先接触和掌握的Java集合工具接口之一。以最具代表性的实现类ArrayList为例,查看其源代码,发现ArrayList不过就是用面向对象的编程方式封装了对一个对象数组的常用操作,使其不仅支持Java原生Array的所有功能,同时也支持前者不具备的动态扩容功能。


image.png

对Java稍有了解的开发者,要自己仿照着写出一个同样的ArrayList实现,并不是一件困难的事情。不过List接口和其众多实现类都是Java开发包的一部分,这使得Java开发者做应用开发时不用重复造轮子,可以直接使用,非常方便。


那么SAP ABAP里存在类似的集合工具类么?


首先我们有内表,具备Java Array的所有功能,并且功能和使用灵活度上来说都远胜后者。但内表的操作毕竟是一种面向过程的编程思路。ABAP里存在类似Java List的接口吗?


通过之前查看Java ArrayList的实现源代码,我们可以仿照其思路,在ABAP里实现一个一模一样的ABAP ArrayList出来,只需要定义一个行类型(Table Line)为对象引用的内表变量,再用面向对象编程方式实现对这个内表变量插入,删除,和按索引访问的功能即可。而Java ArrayList的动态扩容,ABAP内表原生就支持

image.png

事实上SAP CRM就采取了这种实现思路,CL_CRM_BOL_ENTITY_COL,这个工具类,从名称上就能判断出它是BOL实例的存储容器,提供了容器内BOL实例元素的插入,删除和遍历的功能。

image.png

然而这个列表只能插入类型为BOL实例的元素,有更通用的ABAP List工具类么?那就是CL_OBJECT_COLLECTION, 提供了类似Java ArrayList对列表元素的基本操作:

  • 插入
  • 删除
  • 按索引访问
  • 遍历
  • 清空列表

image.png

这个工具类内部维护的内表类型为TYPE STANDARD TABLE OF REF TO OBJECT, 因此可插入指向任何对象实例的引用。

image.png

Jerry这篇博客曾经介绍过该工具类的一个使用例子:


CL_OBJECT_COLLECTION, iterator and Polymorphism


假设我们要开发一个计算图形面积的应用,支持圆形和长方形。实现两个类ZCL_CIRCLE和ZCL_RECTANGLE, 分别按照圆形和长方形的面积计算公式,实现GET_AREA方法。


image.png

image.png

传统的实现方式

定义一个Table Line类型为通用的对象引用(TYPE REF TO OBJECT)的内表lt_shape,用于存放圆形和长方形的实例对象引用。

image.png

每次创建圆形或者长方形的对象实例之后,添加到内表中,然后LOOP内表,逐行取出元素,用IS INSTANCE OF关键字,判断当前记录指向的是圆形还是长方形实例,再用CAST进行强制类型转换,调用对应的面积计算方法。

image.png

这种实现方式,在LOOP里有IF ELSE判断,IS INSTANCE OF和CAST这三种非常丑陋的写法。将来如果要支持其他图形比如三角形的面积计算,又得在LOOP里添加新的ELSE分支,这违反了程序设计的开闭原则-对扩展开放,对修改封闭。


采用CL_OBJECT_COLLECTION的多态实现

定义一个新的接口ZIF_SHAPE,圆形和长方形的类均实现自这个接口:


image.png

借助CL_OBJECT_COLLECTION, 采取面向对象编程里多态(Polymorphism)的思路,我们不仅避免了丑陋的IF-ELSE,繁琐的类型探测IS INSTANCEOF和强制类型转换CAST,同时将代码行数从37行减少到了20行。将来要是得增加对其他图形的支持,只需要新建图形类并实现,而无需修改下面的计算逻辑。


image.png

当然这个例子如果不用CL_OBJECT_COLLECTION, 而是每次把实现了ZIF_SHAPE接口的图形类实例,加入到TABLE LINE类型为TYPE REF TO OBJECT的内表里,然后直接LOOP内表,也可以达到同样的效果。本文只是为了演示CL_OBJECT_COLLECTION的用法,故而没有使用内表来完成计算。


感谢阅读。


相关文章
|
28天前
|
开发者 供应链 BI
SAP ABAP CALL SUBSCREEN 代码解析
SAP ABAP CALL SUBSCREEN 代码解析
35 0
|
28天前
|
SQL Android开发
创建 SAP ABAP CDS View 保存失败 - Dependencies DDL source - View Entity not written
创建 SAP ABAP CDS View 保存失败 - Dependencies DDL source - View Entity not written
8 0
创建 SAP ABAP CDS View 保存失败 - Dependencies DDL source - View Entity not written
|
24天前
|
存储
使用 ABAP 代码打印出 SAP CRM 系统里所有维护了 Sales Area 的 business partner id
使用 ABAP 代码打印出 SAP CRM 系统里所有维护了 Sales Area 的 business partner id
21 0
|
24天前
关于 SAP ABAP OData 服务如何实现 Deep Insert 场景 - SAP 应用的标准行为试读版
关于 SAP ABAP OData 服务如何实现 Deep Insert 场景 - SAP 应用的标准行为试读版
16 1
|
24天前
|
人工智能
Suno AI 生成 SAP ABAP 顾问之歌
Suno AI 生成 SAP ABAP 顾问之歌
19 1
|
25天前
|
存储 安全 数据库
SAP ABAP 中数据类型 xstring 的使用介绍
SAP ABAP 中数据类型 xstring 的使用介绍
21 0
|
28天前
什么是 SAP ABAP 里的 Subscreen
什么是 SAP ABAP 里的 Subscreen
16 1
什么是 SAP ABAP 里的 Subscreen
|
28天前
SAP ABAP 里 CALL SUBSCREEN 语句的使用介绍
SAP ABAP 里 CALL SUBSCREEN 语句的使用介绍
12 1
SAP ABAP 里 CALL SUBSCREEN 语句的使用介绍
|
28天前
SAP ABAP Subscreen 使用介绍试读版
SAP ABAP Subscreen 使用介绍试读版
15 0
SAP ABAP Subscreen 使用介绍试读版
|
28天前
|
Android开发 Windows 缓存
WTS 上打不开 SAP ABAP Development Tool,遇到文件目录 read only 的问题
WTS 上打不开 SAP ABAP Development Tool,遇到文件目录 read only 的问题
10 0
WTS 上打不开 SAP ABAP Development Tool,遇到文件目录 read only 的问题