当前位置:澳门新萄京网址 > 澳门新萄京网址 > ABAP中的枚举对象

ABAP中的枚举对象

文章作者:澳门新萄京网址 上传时间:2019-10-15

 

TYPES:
  BEGIN OF ENUM tsize STRUCTURE size,
    s,
    m,
    l,
    xl,
  END OF ENUM tsize STRUCTURE size.

DATA dobj TYPE tsize.
dobj = size-xl. "允许

也可以编写:

TYPES:
  BEGIN OF ENUM tsize STRUCTURE size,
    s,
    m,
    l,
    xl,
  END OF ENUM tsize STRUCTURE size.

DATA dobj TYPE tsize.

...

CASE dobj.
  WHEN size-s.
    ...
  WHEN size-m.
    ...
  WHEN size-l.
    ...
  WHEN size-xl.
    ...
ENDCASE.
DATA(shirt) = NEW shirt( 333 ).

枚举对象的常见用处是比较它和枚举常量以调节造进程序须求切换来哪多少个效果与利益分支:

RTTI中也多了贰个一面依然的类CL_ABAP_ENUMDESCR

然而,使用了枚举对象后,你不再需求管理特别了。借让你传递一个不合法值的话,会获取语法错误!

CLASS shirt DEFINITION.
  PUBLIC SECTION.
    TYPES:
      BEGIN OF ENUM tsize,
        size_s,
        size_m,
        size_l,
        size_xl,
      END OF ENUM tsize.
    METHODS
      constructor IMPORTING size TYPE tsize.
    ...
  PRIVATE SECTION.
    DATA
      size TYPE tsize.
ENDCLASS.

CLASS shirt IMPLEMENTATION.
  METHOD constructor.
    me->size = size.
  ENDMETHOD.
ENDCLASS.

看看费用了吗?为何不让运营时情状来为您做值检查呢?有一种名称为枚举和枚举类型的定义(可以在此种气象下行使)。

上述代码定义了贰个枚举结构size。结构的零部件是枚举类型的枚举常量。

TYPES:
  BEGIN OF ENUM tsize,
    size_s,
    size_m,
    size_l,
    size_xl,
  END OF ENUM tsize.

DATA size TYPE tsize.
size = size_xl. "允许

DATA dobj LIKE size.
dobj = size. "允许

dobj = 333. "语法或运行时错误
DATA(shirt) = NEW shirt( shirt=>size_xl ).

可以行使CONV操作符钦点项目来访谈当前值:

另一种办法是,能够应用CONV将贰个一蹴而就的枚举值转变为枚举对象(常规的赋值语句是力不可能支形成的):

 除此而外,还应该有局地能够使用的情事:

基本上正是那个剧情了。

DATA(text) = CONV string( size_xl ).

TYPES语句的一个新变式:BEGIN OF ENUMEND OF ENUM,它能够围起四个常量的集。常量的正规化基本项目是i同期枚举值从0起始计数。

TYPES:
  BEGIN OF ENUM tsize,
    size_s,
    size_m,
    size_l,
    size_xl,
  END OF ENUM tsize.

DATA(value) = CONV i( size_xl ) .
cl_demo_output=>display( value ). "输出结果是3

 

日常,你或多或少也不关注枚举对象的内容。枚举对象的语义由枚举常量来定义。可是,你也得以将枚举类型定义为i类型之外的任何基本项目,并且存有别样枚举值(当中三个亟须是最先值):

枚举是项目和常量的混合体。通过BEGIN OF ENUM enum – END OF ENUM enum 你阐明了一个能够在TYPE附加项后宣称的着力项目enum。在它们中间,你可以声美赞臣(Meadjohnson)个常量集,它们叫做枚举常量。那样就定义了具备enum品类的枚举对象所允许的枚举值。在那间,TYPES实在就和CONSTANTS言辞同样。

罗马尼亚(România)语原来的作品:ABAP News for Release 7.51 – Enumerations

TYPES:
  BEGIN OF ENUM tsize,
    size_s,
    size_m,
    size_l,
    size_xl,
  END OF ENUM tsize.

DATA text TYPE string.
text = size_xl.
cl_demo_output=>display( text ). "结果是SIZE_XL

像上文那样采取的话:

ABAP运营时意况会检查唯有被允许的枚举值能够被赋给枚举对象。

 

躺下让ABAP运维时来为你事业吗。要注意枚举类型只好在一些切合的演算地方中出现,况兼只可以分包预先规定的值。违规的枚举值恒久不会在枚举对象中冒出。

 

图片 1

TYPES:
  basetype TYPE c LENGTH 2,
  BEGIN OF ENUM tsize BASE TYPE basetype,
    size_i  VALUE IS INITIAL,
    size_s  VALUE `S`,
    size_m  VALUE `M`,
    size_l  VALUE `L`,
    size_xl VALUE `XL`,
  END OF ENUM tsize.

DATA size TYPE tsize.
size = size_xl. "允许

DATA dobj LIKE size.
dobj = size."允许

只要您在一个上下文中有超过常规多个枚举类型,你能够将顺序枚举值组织到组织里:

那让你能够轻易地把现成“枚举值”转变为新措施的枚举值。运气好的话,能够无需调整它们的选取。

小编的答应是:这些性子实际阳节经在设计中了,很有愿意现身。具体景况要视财富和预先级而定。

在7.51以至更加高的本子里,ABAP也会支撑枚举概念。假若应用枚举类型来重写下边包车型客车例证的话:

CLASS cx_wrong_size DEFINITION INHERITING FROM cx_static_check.
 ENDCLASS.

 CLASS shirt DEFINITION.
   PUBLIC SECTION.
     TYPES tsize TYPE i.
     CONSTANTS:
       size_s  TYPE tsize VALUE 0,
       size_m  TYPE tsize VALUE 1,
       size_l  TYPE tsize VALUE 2,
       size_xl TYPE tsize VALUE 3.
     METHODS
       constructor IMPORTING size TYPE tsize
                   RAISING   cx_wrong_size.
     ...
   PRIVATE SECTION.
     DATA
       size TYPE tsize.
 ENDCLASS.

 CLASS shirt IMPLEMENTATION.
   METHOD constructor.
     IF size <> size_s AND
        size <> size_m AND
        size <> size_l AND
        size <> size_xl.
       RAISE EXCEPTION TYPE cx_wrong_size.
     ENDIF.
     me->size = COND #(
       WHEN size <> size_s AND
                    size <> size_m AND
                    size <> size_l AND
                    size <> size_xl THEN THROW cx_wrong_size( )
       ELSE size ).
   ENDMETHOD.
 ENDCLASS.
TRY.
    DATA(shirt) = NEW shirt( shirt=>size_xl ).
  CATCH cx_wrong_size.
    ...
ENDTRY.

本文链接:

那是一种常见的形式。在ABAP 7.51事先,大家经常用如下格局贯彻类似的功效:

您能够将枚举对象赋给贰个c品类只怕string项目的文件。结果正是概念了枚举值的枚举常量的名字。

 

 

此地,size属性只好是shirt类中定义的常量中的值。其余值会导致非常。顾客创造shirt类时,必要这么做:

枚举对象只可以赋值给持有一致枚举类型的枚举对象。同样,枚举对象间的可比也只还好同等档期的顺序的枚举对象间发生。当然,枚举常量自己也带有在内。

TYPES:
  BEGIN OF ENUM tsize,
    size_s,
    size_m,
    size_l,
    size_xl,
  END OF ENUM tsize.

DATA(size) = VALUE tsize( ).

DATA(enum_descr) = CAST cl_abap_enumdescr(
  cl_abap_typedescr=>describe_by_data( size ) ).

cl_demo_output=>new(
  )->write_data( enum_descr->kind            "E, for elementary
  )->write_data( enum_descr->type_kind       "k, new for enumerated type
  )->write_data( enum_descr->base_type_kind  "I, the base type
  )->write_data( enum_descr->members         "Table of constants and values
  )->display( ).

枚举对象是枚举类型的数目对象。枚举对象只好分包类型为枚举类型的枚举值。ABAP从版本7.51方始援助它们。

TYPES:
  BEGIN OF ENUM tsize,
    size_s,
    size_m,
    size_l,
    size_xl,
  END OF ENUM tsize.

DATA(num) = 3.

TRY.
    DATA(dobj) = CONV tsize( num ) .
    cl_demo_output=>display( dobj ). "Output is SIZE_XL
  CATCH cx_sy_conversion_no_enum_value.
    ...
ENDTRY.

PS:原作的评说中有人提到,枚举值和数量字典中的domain的固定值很像,为啥双方未有并轨关系?

本文由澳门新萄京网址发布于澳门新萄京网址,转载请注明出处:ABAP中的枚举对象

关键词: