静的メソッドとインスタンスメソッド、変数、初期化コード
特徴
静的メソッド、変数、および初期化コードには次の特性があります。
- クラスに関連付けられる。
- 外部クラスでのみ許可される。
- クラスが読み込まれたときにのみ初期化される。
- Visualforce ページ���ビューステートの一部として転送されない。
インスタンスメソッド、メンバー変数、および初期化コードには次の特性があります。
- 特定のオブジェクトに関連付けられる。
- 定義修飾子がない。
- 宣言されたクラスからインスタンス化された各オブジェクトと一緒に作成される。
ローカル変数には次の特性があります。
- 宣言されたコードのブロックに関連付けられる。
- 使用前に初期化する必要がある。
次の例は、範囲が if コードブロックの持続時間であるローカル変数を示します。
静的メソッドと変数の使用
外部クラスの静的メソッドと変数のみを使用できます。内部クラスには静的メソッドや変数はありません。静的メソッドまたは変数を実行するために、クラスのインスタンスは必要ありません。
クラスのオブジェクトが作成される前に、クラスの静的メンバー変数がすべて初期化され、静的初期化コードブロックがすべて実行されます。これらの項目は、クラスに表示される順序で処理されます。
静的メソッドはユーティリティメソッドとして使用され、インスタンスメンバー変数の値に依存することはありません。静的メソッドは、1 つのクラスのみに関連付けられているため、そのクラスのインスタンスメンバー変数の値にはアクセスできません。
静的変数は、Apex トランザクションの範囲内でのみ静的です。サーバー全体または組織全体で静的なわけではありません。静的変数の値は、1 回のトランザクションのコンテキスト内で保持され、トランザクションの境界を超えたときにリセットされます。たとえば、Apex DML 要求によってトリガーが何回も起動される場合、これらのトリガー呼び出しを通して静的変数は保持されます。
クラスのインスタンス間で共有された情報を保存するには、静的変数を使用します。同じクラスのすべてのインスタンスが、静的変数の 1 つのコピーを共有します。たとえば、1 回のトランザクションで実行されるすべてのトリガーは、関連するクラス内の静的変数を確認したり更新したりすることで、互いに通信することができます。再帰的なトリガーは、クラス変数の値を使用して、再帰を終了するタイミングを判断できます。
次のクラスがあるとします。
このクラスを使用するトリガーは、選択的にトリガーの最初の実行を失敗することができます。
トリガーで定義された静的変数の値は、同じトランザクション内の異なるトリガーコンテキスト間 (insert の呼び出し前と呼び出し後など) では保持されません。代わりに、クラスに静的変数を定義して、トリガーがこれらのクラスメンバー変数にアクセスし、静的値を確認できるようにします。
クラスの静的変数に、そのクラスのインスタンスを介してアクセスすることはできません。クラス MyClass に静的変数 myStaticVariable があり、myClassInstance が MyClass のインスタンスの場合、myClassInstance.myStaticVariable は不正な表現です。
インスタンスメソッドの場合も同様です。myStaticMethod() が静的メソッドの場合、myClassInstance.myStaticMethod() は不正です。代わりに、クラス MyClass.myStaticVariable および MyClass.myStaticMethod() を使用して、これらの静的識別子を参照します。
内部クラスは、Java の静的な内部クラスのように機能しますが、static キーワードを要求しません。内部クラスは、外部クラスのようにインスタンスメンバー変数を持つことができますが、(this キーワードを使った) 外部クラスのインスタンスへの暗黙的ポインターはありません。
インスタンスメソッドと変数の使用
インスタンスメソッドとメンバー変数は、クラスのインスタンス、すなわちオブジェクトによって使用されます。インスタンスメンバー変数は、メソッド内ではなく、クラス内で宣言されます。インスタンスメソッドは通常、インスタンスメンバー変数を使用してメソッドの動作に影響を及ぼします。
二次元の点を集めるクラスを作成し、それらの点をグラフ上にプロットするとします。次のスケルトンクラスは、メンバー変数を使用して点のリストを保持し、内部クラスを使用して点の二次元リストを管理します。
初期化コードの使用
インスタンス初期化コードは、クラス内で定義される、次の形式のコードブロックです。
クラス内のインスタンス初期化コードは、そのクラスからオブジェクトがインスタンス化されるたびに実行されます。これらのコードブロックは、コンストラクターの前に実行されます。
クラスに独自のコンストラクターを記述しない場合は、インスタンス初期化コードブロックを使用してインスタンス変数を初期化できます。簡単な状況では、通常のイニシャライザーを使用します。初期化コードは、静的対応付けの初期化など、複雑な状況にのみ使用します。静的初期化ブロッ���は、そのブロックを含むクラスにアクセスする回数に関係なく、1 回のみ実行されます。
静的初期化コードは、キーワード static に続くコードブロックです。
他の静的コードと同様に、静的初期化コードブロックは、クラスの初回使用時に一度だけ初期化されます。
1 つのクラスに、静的初期化コードブロックまたはインスタンス初期化コードブロックのいずれかを、任意の数含めることができます。コード本文のどこに記述しても構いません。Java の場合と同様に、コードブロックはファイルに表示される順序で実行されます。
静的初期化コードを使用して、静的なファイナル変数を初期化したり、値の対応付けなど静的な情報を宣言したりできます。次に例を示します。
バージョン管理動作の変更
API バージョン 50.0 以降の場合、範囲およびアクセシビリティのルールは、@namespaceAccessible アノテーションが付加されている Apex 変数、メソッド、内部クラス、およびインターフェースに適用されます。アクセシビリティの考慮事項については、「NamespaceAccessible アノテーション」を参照してください。名前空間ベースの参照についての詳細は、「第二世代パッケージでの Apex クラスの名前空間ベースの参照」を参照してください。