ABAP函数方法返回多类型内表的设计模式问题及优化问询
SAP ABAP ALV展示场景的封装优化方案
针对你遇到的封装性破坏和内存安全风险问题,提供以下几种更优实现方案:
方案一:返回私有内表的只读副本
- 子类重写
get_data()方法,返回私有内表的拷贝而非引用,外部拿到的是独立的数据副本,既无法修改原私有内表,也不存在原内表释放后引用失效的风险。 - 实现示例:
METHOD get_data. rt_data = CORRESPONDING #( me->mt_private_table ). " 生成数据副本 ENDMETHOD.
- 注意:如果内表数据量极大,拷贝会带来一定性能损耗,此时优先考虑方案二。
方案二:将ALV展示逻辑完全封装在类内部
- 在抽象类中定义抽象方法
display_alv(),子类实现该方法时,直接在类内部调用ALV展示函数(如REUSE_ALV_GRID_DISPLAY_LVC或CL_GUI_ALV_GRID=>SET_TABLE_FOR_FIRST_DISPLAY),传入私有内表和字段目录。 - 外部仅需调用对象的
display_alv()方法即可完成展示,完全无需接触内部数据,彻底规避原方案的两个问题。 - 完整代码示例:
* 抽象类定义 CLASS zcl_abstract_obj DEFINITION ABSTRACT. PUBLIC SECTION. METHODS display_alv ABSTRACT. " 对外暴露的ALV展示方法 PROTECTED SECTION. METHODS get_fieldcatalog RETURNING VALUE(rt_fcat) TYPE lvc_t_fcat ABSTRACT. " 子类实现字段目录生成 ENDCLASS. * 子类定义 CLASS zcl_concrete_obj DEFINITION INHERITING FROM zcl_abstract_obj. PRIVATE SECTION. DATA mt_private_data TYPE STANDARD TABLE OF zs_my_obj_struc. " 私有内表 METHODS load_internal_data. " 内部加载数据的方法 ENDCLASS. * 子类实现 CLASS zcl_concrete_obj IMPLEMENTATION. METHOD display_alv. DATA(lt_fcat) = me->get_fieldcatalog( ). " 调用ALV展示函数,直接使用私有内表 CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC' EXPORTING it_fieldcat_lvc = lt_fcat TABLES t_outtab = mt_private_data. ENDMETHOD. METHOD get_fieldcatalog. " 生成当前对象类型对应的字段目录逻辑 APPEND INITIAL LINE TO rt_fcat ASSIGNING FIELD-SYMBOL(<ls_fcat>). <ls_fcat>-fieldname = 'FIELD1'. <ls_fcat>-scrtext_l = '字段1'. " ... 其他字段设置 ENDMETHOD. METHOD load_internal_data. " 私有内表数据加载逻辑 SELECT * FROM zt_my_table INTO TABLE mt_private_data. ENDMETHOD. ENDCLASS. * 外部调用示例 DATA(lo_obj) = NEW zcl_concrete_obj( ). lo_obj->load_internal_data( ). lo_obj->display_alv( ).
方案三:只读字段符号引用(备选)
如果业务场景必须返回引用,可使用只读字段符号限制外部修改,但无法解决内表释放后的内存风险,仅作为临时备选:
METHOD get_data_ref. FIELD-SYMBOLS: <lt_readonly> TYPE STANDARD TABLE READ-ONLY. ASSIGN me->mt_private_table TO <lt_readonly>. rv_data_ref = REF #( <lt_readonly> ). ENDMETHOD.
内容的提问来源于stack exchange,提问作者Cutter
相关产品推荐
相关产品推荐

