是否有可能在ABAP中创建枚举(enum)?
问题描述:
是否有可能在ABAP中创建Enumeration(枚举),如Java?是否有可能在ABAP中创建枚举(enum)?
据我所知,我们可以定义一个domain with fixed values,但它们只用于屏幕。
答
有在ABAP枚举没有原生支持,但你可以模拟与几个简单的步骤相同的行为:
- 创建“枚举”类;
- 将实例构造函数设置为private;
- 为每个“枚举对象”添加
TYPE REF TO <your_class>
的静态属性; - 创建一个
CLASS_CONSTRUCTOR
并用所需的属性实例化每个“枚举对象”。
举例来说,如果你有一个状态枚举,你可能有一个CL_STATUS
类CL_STATUS=>APPROVED
和CL_STATUS=>REJECTED
枚举对象。
答
不,没有办法在ABAP中创建一个枚举。虽然枚举在编译时被检查,但域显然不可以 - 域和使用它的程序可以被修改并完全独立运输。
最接近你会得到的是使用域对域值验证任何数据,在许多情况下手动验证(正如你指出的,经典的dynpro屏幕会自动检查并检查固定值 - for无论如何CHAR和NUMC)。
答
一个稍微接近的方法是使用以下;
常数:开始的状态, 型式认可我的价值01, 拒绝I型值02,状态 结束。
所以现在,你在整个程序中使用这个常量。如果你想让它们成为全局的,那么在全局类中创建它们作为类属性。
你会做同样的本地枚举吗? (例如在报告中),那么创建局部常量就不那么复杂了。还是我错了? – inetphantom
如果您需要的只是不同的值,例如状态'A'的标志为已批准,'R'标志为已拒绝,则通过将其设为枚举而不是常数,没有实际收益。但是如果你想添加行为到这些标志,这样一个方法来决定文档是否应该被处理,那么enum对象是最好的,因为代码可以简单地执行'lo_status-> is_valid_for_processing()'而不用担心哪个状态是有效与否,将此逻辑封装在状态类中。如果你使用常量,那么许多IF可能会被复制到这个相同逻辑的代码中。 – MichelHenrich