コンテンツフレーム起動

参照変数とオブジェクトインスタンス 文書を SAP ライブラリストラクチャに組み込む

オブジェクトはプログラムのメモリ領域にあるクラスの実行時インスタンスです。プログラムは参照変数と呼ばれるポインタを使って個別オブジェクトにアクセスします。クラスのインスタンスを登録するには、クラスと同じデータ型の参照変数が必要です。参照変数を登録するときは、新しいデータ型のオブジェクト参照を使用します。

参照変数

参照変数を宣言するときは、

命令 DATA < オブジェクト > TYPE REF TO < クラス > を使用します。

システムは最初に、同じプログラム内のローカルのクラス <class> の定義を探します。それが見つからないと、クラスライブラリをグローバルに検索します。参照変数は、タイプ <class> のオブジェクト変数とも呼ばれます。データ型 <class> のオブジェクト変数 <obj> はクラス <class> のインスタンスをポイントできる だけです。

オプション TYPE REF TO <class> ABAP 命令で使用すれば、たとえば TYPES 命令のなかで、またはルーチンのインタフェースパラメータのデータ型を指定するときに、データ型を指定することができます。

オブジェクトインスタンス

クラス <class> に対してオブジェクト変数 <obj> を宣言すると、命令

CREATE OBJECT <obj> を使ってオブジェクトを宣言することができます。

クラス <class> の実行時インスタンスがメモリに生成され、オブジェクト変数 <obj> はオブジェクトを参照します。プログラムはオブジェクト変数を使用してオブジェクトの パブリックコンポーネントにアクセスすることができます。オブジェクト変数 <obj> を使ってオブジェクトコンポーネントにアクセスするときは、次の構文を使用します。

例

次の例は、前のセクションで登録したクラス C_COUNTER のインスタンスを登録する方法を示します( クラスとクラスコンポーネントを参照してください)。

DATA REF_COUNTER_1 TYPE REF TO C_COUNTER.

DATA NUMBER TYPE I VALUE 5.

CREATE OBJECT REF_COUNTER_1.

CALL METHOD REF_COUNTER_1->SET_COUNTER
            EXPORTING SET_VALUE = NUMBER.

DO 3 TIMES.
  CALL METHOD REF_COUNTER_1->INCREMENT_COUNTER.
ENDDO.

CALL METHOD REF_COUNTER_1->GET_COUNTER
            IMPORTING GET_VALUE = NUMBER.

最初の命令ではデータ型 C_COUNTER のオブジェクト変数を登録しています。 CREATE OBJECT 命令でクラス C_COUNTER の最初のオブジェクトをプログラムメモリに登録しています。オブジェクト変数 REF_COUNTER_1 はオブジェクトとそのインタフェースを参照します。

このグラフィックは添付のテキストに説明されています
クラス C_COUNTER の最初のインスタンスは C_COUNTER<1> と呼ばれます。 CREATE ONJECT 命令が実行されたあとでオブジェクト変数 REF_COUNTER_1 がデバッガでこのように表示されるためです。この名称は内部プログラム管理のためだけに使用されます。 ABAP プログラム自身では使用されません。

ABAP プログラムはオブジェクト変数 REF_COUNTER_1 だけを使用してオブジェクトのパブリックメソッドにアクセスします。プログラムのこの部分が実行されると、プログラム変数 NUMBER と私用オブジェクト変数 COUNT の値は両方とも8となります。

同じデータ型のオブジェクトを何個でも登録することができます。オブジェクトはそれぞれ完全に独立します。各オブジェクトにはそれ自身のプログラム内でのアイデンティティと属性があります。 CREATE OBJECT 命令を実行するつど、アイデンティティが一意のオブジェクト参照によって定義される新しいオブジェクトが生成されます。

例

次の例はプログラムがクラス C_COUNTER の独立したカウンタとして機能するインスタンスを複数生成する方法を示します( クラスとクラスコンポーネントの例を参照してください)。

DATA: REF_COUNTER_1 TYPE REF TO C_COUNTER,
      REF_COUNTER_2 TYPE REF TO C_COUNTER,
      REF_COUNTER_3 LIKE REF_COUNTER_1.

DATA: NUMBER1 TYPE I VALUE 5,
      NUMBER2 TYPE I VALUE 0,
      NUMBER3 TYPE I VALUE 2.

CREATE OBJECT: REF_COUNTER_1,
               REF_COUNTER_2,
               REF_COUNTER_3.

CALL METHOD: REF_COUNTER_1->SET_COUNTER
             EXPORTING SET_VALUE = NUMBER1,

             REF_COUNTER_2->SET_COUNTER
             EXPORTING SET_VALUE = NUMBER2,

             REF_COUNTER_3->SET_COUNTER
             EXPORTING SET_VALUE = NUMBER3.

DO 3 TIMES.
  CALL METHOD REF_COUNTER_1->INCREMENT_COUNTER.
ENDDO.

CALL METHOD: REF_COUNTER_2->INCREMENT_COUNTER,
             REF_COUNTER_3->INCREMENT_COUNTER.

CALL METHOD: REF_COUNTER_1->GET_COUNTER
             IMPORTING GET_VALUE = NUMBER1,

             REF_COUNTER_2->GET_COUNTER
             IMPORTING GET_VALUE = NUMBER2,

             REF_COUNTER_3->GET_COUNTER
             IMPORTING GET_VALUE = NUMBER3.

最初の命令ではデータ型 C_COUNTER のオブジェクト変数を登録しています。 CREATE OBJECT 命令でクラス C_COUNTER の最初のオブジェクトをプログラムメモリに登録しています。該当するオブジェクト変数がこれらのオブジェクトを参照しています。

このグラフィックは添付のテキストに説明されています
内部プログラム管理では、個別インスタンスは C_COUNTER<1> C_COUNTER<2> C_COUNTER<3> と呼ばれます。これらの個別インスタンスは登録順に命名されています。 ABAP プログラムはオブジェクト変数だけを使用してインスタンスにアクセスします。プログラムのこの部分が処理されると、プログラム変数 NUMBER1 NUMBER2 NUMBER3 の値はそれぞれ8、1、3となります。同じように、各オブジェクト内の内部変数 COUNT はこれと同じ異なる値となります。このように、すべてのオブジェクトはデータ型は同じですが、属性はこの場合のカウントのように異なります。

複数の参照変数が1つのオブジェクトをポイントすることができます。 CREATE OBJECT 命令とは別に、オブジェクト変数間の通常の割当命令( ABAP キーワード MOVE )を使ってオブジェクト変数をオブジェクトに割り当てることができます。その場合の条件は、個別オブジェクト変数はデータ型が同じでなければならないということだけです。そのため、同じクラスのオブジェクト間で参照の割当を変更することができるので、最初のオブジェクト変数がいつも同じオブジェクトをポイントするとはかぎりません。

少なくとも1つのオブジェクト変数からポイントされているかぎり、オブジェクトは存在しつづけます。参照変数がオブジェクトをポイントしなくなった時点で、そのオブジェクトはガーベージコレクションメカニズム(オブジェクトの自動メモリ管理)によって削除されます。

例

次の例はプログラムがクラス C_COUNTER のインスタンスに対する参照の割当 E を変更する方法を示します( クラスとクラスコンポーネントの例を参照してください)。

DATA: REF_COUNTER_1 TYPE REF TO C_COUNTER,
REF_COUNTER_2 TYPE REF TO C_COUNTER,
REF_COUNTER_3 LIKE REF_COUNTER_1.

CREATE OBJECT: REF_COUNTER_1,
REF_COUNTER_2.

MOVE REF_COUNTER_2 TO REF_COUNTER_3.

CLEAR REF_COUNTER_2.

REF_COUNTER_1 = REF_COUNTER_3.

最初の命令ではデータ型 C_COUNTER のオブジェクト変数を登録しています。 CREATE OBJECT 命令でクラス C_COUNTER の2つのオブジェクトをプログラムメモリに登録しています。オブジェクト変数 REF_COUNTER_1 REF_COUNTER_2 はそれぞれの内部名が C_COUNTER<1> C_COUNTER<2> のオブジェクトをポイントします。 MOVE 命令のあと、 REF_COUNTER_3 もオブジェクト C_COUNTER<2> をポイントします。

このグラフィックは添付のテキストに説明されています
これらのオブジェクト変数のどちらかを使用し C_COUNTER<2> にアクセスしても結果は同じです。属性値はオブジェクト自身に属し、オブジェクトをアドレスする参照変数には属しません。

CLEAR 命令のあと、変数 REF_COUNTER_2 はオブジェクトを参照しなくなるので、その宣言の直後と同じ状態となります。最後の割当命令により、オブジェクト変数 REF_COUNTER_1 C_COUNTER<1> から C_COUNTER<2> に割当が変更されます。

このグラフィックは添付のテキストに説明されています
つまり、オブジェクト C_COUNTER<1> をポイントする参照変数がなくなったわけです。したがって、このオブジェクトはメモリから自動的に削除されます。

 

 

 

 

 

 

コンテンツフレーム終了