是否有可能在ABAP中创建枚举(enum)?

问题描述:

是否有可能在ABAP中创建Enumeration(枚举),如Java是否有可能在ABAP中创建枚举(enum)?

据我所知,我们可以定义一个domain with fixed values,但它们只用于屏幕。

有在ABAP枚举没有原生支持,但你可以模拟与几个简单的步骤相同的行为:

  1. 创建“枚举”类;
  2. 将实例构造函数设置为private;
  3. 为每个“枚举对象”添加TYPE REF TO <your_class>的静态属性;
  4. 创建一个CLASS_CONSTRUCTOR并用所需的属性实例化每个“枚举对象”。

举例来说,如果你有一个状态枚举,你可能有一个CL_STATUSCL_STATUS=>APPROVEDCL_STATUS=>REJECTED枚举对象。

+0

你会做同样的本地枚举吗? (例如在报告中),那么创建局部常量就不那么复杂了。还是我错了? – inetphantom

+1

如果您需要的只是不同的值,例如状态'A'的标志为已批准,'R'标志为已拒绝,则通过将其设为枚举而不是常数,没有实际收益。但是如果你想添加行为到这些标志,这样一个方法来决定文档是否应该被处理,那么enum对象是最好的,因为代码可以简单地执行'lo_status-> is_valid_for_processing()'而不用担心哪个状态是有效与否,将此逻辑封装在状态类中。如果你使用常量,那么许多IF可能会被复制到这个相同逻辑的代码中。 – MichelHenrich

不,没有办法在ABAP中创建一个枚举。虽然枚举在编译时被检查,但域显然不可以 - 域和使用它的程序可以被修改并完全独立运输。

最接近你会得到的是使用域对域值验证任何数据,在许多情况下手动验证(正如你指出的,经典的dynpro屏幕会自动检查并检查固定值 - for无论如何CHAR和NUMC)。

一个稍微接近的方法是使用以下;

常数:开始的状态, 型式认可我的价值01, 拒绝I型值02,状态 结束。

所以现在,你在整个程序中使用这个常量。如果你想让它们成为全局的,那么在全局类中创建它们作为类属性。

从ABAP release 7.51中也可以使用ABAP中的枚举。 看到这blog欲了解更多信息