ABAP中的枚举对象澳门蒲京网址

枚举对象只能包含类型为枚举类型的枚举值,枚举对象只能包含类型为枚举类型的枚举值

 

 

枚举对象是枚举类型的数码对象。枚举对象只可以分包类型为枚举类型的枚举值。ABAP从版本柒.5一初始协理它们。

枚举对象是枚举类型的数目对象。枚举对象只好分包类型为枚举类型的枚举值。ABAP从版本7.5一早先帮助它们。

那是一种常见的方式。在ABAP 柒.5一事先,人们屡见不鲜用如下格局达成类似的功效:

那是1种普遍的方式。在ABAP 七.5一事先,人们平常用如下情势贯彻类似的效劳:

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.
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.

那边,size属性只可以够是shirt类中定义的常量中的值。其余值会导致相当。用户成立shirt类时,须求那样做:

那边,size属性只好是shirt类中定义的常量中的值。其余值会导致很是。用户创立shirt类时,须求如此做:

TRY.
    DATA(shirt) = NEW shirt( shirt=>size_xl ).
  CATCH cx_wrong_size.
    ...
ENDTRY.
TRY.
    DATA(shirt) = NEW shirt( shirt=>size_xl ).
  CATCH cx_wrong_size.
    ...
ENDTRY.

看到开销了呢?为何不让运营时环境来为你做值检查吗?有一种名字为枚举和枚举类型的定义(能够在那种状态下选取)。

见状开销了吧?为何不让运行时环境来为您做值检查吗?有1种名字为枚举和枚举类型的概念(能够在那种状态下采用)。

在7.5一以及越来越高的本子里,ABAP也会支撑枚举概念。如若使用枚举类型来重写上边的事例的话:

在7.51以及更加高的版本里,ABAP也会援救枚举概念。尽管选取枚举类型来重写上边的例证的话:

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.
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.

TYPES语句的多少个新变式:BEGIN OF ENUMEND OF
ENUM
,它能够围起二个常量的集。常量的规范基本项目是i再正是枚举值从0先河计数。

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

像上文那样采纳的话:

像上文那样采纳的话:

DATA(shirt) = NEW shirt( shirt=>size_xl ).
DATA(shirt) = NEW shirt( shirt=>size_xl ).

不过,使用了枚举对象后,你不再必要处理至极了。假使您传递1个违规值的话,会收获语法错误!

只是,使用了枚举对象后,你不再需求处理极度了。假如你传递贰个违法值的话,会博得语法错误!

DATA(shirt) = NEW shirt( 333 ).
DATA(shirt) = NEW shirt( 333 ).

澳门蒲京网址 1

澳门蒲京网址 2

 

 

枚举是项目和常量的混合体。通过BEGIN OF ENUM enum – END OF ENUM
enum

你注解了2个能够在TYPE附加项后宣称的为主项目enum。在它们之间,你能够声明一(Beingmate)个常量集,它们叫做枚举常量。那样就定义了富有enum花色的枚举对象所允许的枚举值。在此间,TYPES实则就和CONSTANTS言语1样。

枚举是连串和常量的混合体。通过BEGIN OF ENUM enum – END OF ENUM
enum

你注解了八个方可在TYPE附加项后评释的骨干类型enum。在它们中间,你能够表明一(Wissu)个常量集,它们叫做枚举常量。那样就定义了拥有enum类型的枚举对象所允许的枚举值。在此间,TYPES其实就和CONSTANTS言辞1样。

ABAP运营时环境会检讨唯有被允许的枚举值能够被赋给枚举对象。

ABAP运维时环境会检查只有被允许的枚举值能够被赋给枚举对象。

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. "语法或运行时错误
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. "语法或运行时错误

枚举对象只好赋值给持有一致枚举类型的枚举对象。同样,枚举对象间的可比也只幸亏同样档次的枚举对象间发生。当然,枚举常量本人也含有在内。

枚举对象只好赋值给全部同样枚举类型的枚举对象。同样,枚举对象间的比较也不得不在同1类其余枚举对象间产生。当然,枚举常量自己也带有在内。

平日,你或多或少也不关切枚举对象的始末。枚举对象的语义由枚举常量来定义。可是,你也得以将枚举类型定义为i类型之外的任何基本项目,并且拥有别样枚举值(其中3个务必是早先值):

常见,你或多或少也不关注枚举对象的始末。枚举对象的语义由枚举常量来定义。然则,你也能够将枚举类型定义为i类型之外的别的基本项目,并且存有别样枚举值(个中三个亟须是开首值):

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."允许
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."允许

那使你可以轻松地把现有“枚举值”转换为新情势的枚举值。运气好的话,能够不须要调整它们的选择。

那使你能够轻松地把现有“枚举值”转换为新办法的枚举值。运气好的话,能够不需求调动它们的运用。

假如你在3个上下文中有超过1个枚举类型,你可以将各类枚举值组织到协会里:

若果你在一个上下文中有跨越四个枚举类型,你能够将相继枚举值协会到协会里:

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.
dobj = size-xl. "允许

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

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

 

 

枚举对象的大面积用处是比较它和枚举常量以控制造进度序需求切换成哪三个功能分支:

枚举对象的宽泛用处是比较它和枚举常量以决定程序供给切换来哪2个效果分支:

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.
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.

 除外,还有一部分方可选用的事态:

 除却,还有部分足以动用的景况:

你能够将枚举对象赋给2个c品种大概string类其余文件。结果正是概念了枚举值的枚举常量的名字。

您能够将枚举对象赋给1个c花色或然string品类的公文。结果正是概念了枚举值的枚举常量的名字。

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
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

也得以创作:

也能够创作:

DATA(text) = CONV string( size_xl ).
DATA(text) = CONV string( size_xl ).

能够应用CONV操作符钦赐项目来访问当前值:

能够行使CONV澳门蒲京网址,操作符钦命项目来访问当前值:

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
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

另壹种方法是,可以应用CONV将2个卓有成效的枚举值转换为枚举对象(常规的赋值语句是无法成功的):

另1种格局是,能够选用CONV将叁个使得的枚举值转换为枚举对象(常规的赋值语句是无能为力到位的):

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.
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.

RTTI中也多了一个应和的类CL_ABAP_ENUMDESCR

RTTI中也多了一个一面如旧的类CL_ABAP_ENUMDESCR

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( ).
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运转时来为你工作吗。要留意枚举类型只可以在壹些适合的演算位置中出现,并且只好分包预先规定的值。违法的枚举值永远不会在枚举对象中冒出。

躺下让ABAP运营时来为你工作吗。要专注枚举类型只可以在一些适合的演算地点中出现,并且只好分包预先规定的值。违规的枚举值永远不会在枚举对象中出现。

 

 

PS:原版的书文的评论和介绍中有人提到,枚举值和数量字典中的domain的固定值很像,为何双方没有并轨关系?

PS:原来的小说的评论和介绍中有人提到,枚举值和数码字典中的domain的固定值很像,为啥两方未有并轨关系?

作者的作答是:那些特点实际桐月经在统一筹划中了,很有愿意出现。具体情状要视财富和预先级而定。

作者的答应是:那几个特点实际春日经在设计中了,很有非常大可能率出现。具体意况要视能源和预先级而定。

 

 

正文链接:http://www.cnblogs.com/hhelibeb/p/7976078.html

正文链接:http://www.cnblogs.com/hhelibeb/p/7976078.html

英文原稿:ABAP News for Release 7.51 –
Enumerations

英文原稿:ABAP News for Release 7.51 –
Enumerations