静的およびインスタンスメソッド
Apex では、静的メソッド、変数、および初期化コードを持つことができます。Apex クラスは静的にできません。また、インスタンスメソッド、メンバー変数、および初期化コード (修飾子を含まない) とローカル変数も持つことができます。
- 静的メソッド、変数、または初期化コードは、クラスに関連付けられており、外部クラス内のみで許可されています。static として、メソッドまたは変数を宣言した場合、クラスが読み込まれたときの一度だけ初期化されます。静的な変数は Visualforce ページのビューステートの一部として転送されません。
- インスタンスメソッド、メンバー変数、初期化コードは、特定のオブジェクトに関連付けられており、定義修飾子はありません。インスタンスメソッド、メンバー変数、初期化コードを宣言すると、そのクラスからインスタンス化された各オブジェクトと一緒にその項目のインスタンスが作成されます。
- ローカル変数は、宣言されたコードのブロックと関連付けられます。すべてのローカル変数は、使用前に初期化する必要があります。
次は、範囲が if コードブロックの持続時間であるローカル変数の例です。
1Boolean myCondition = true;
2if (myCondition) {
3 integer localVariable = 10;
4}静的メソッドと変数の使用
外部クラスの静的メソッドと静的変数のみを使用できます。内部クラスには静的なメソッドや変数はありません。静的メソッドや静的変数は、実行にクラスのインスタンスは必要ありません。
クラス内のすべての静的メンバー変数は、クラスのオブジェクトが作成される前に初期化されます。これには、静的初期化コードブロックが含まれます。これらのコードブロックは、クラス内で表示される順番に実行されます。
静的メソッドは、一般にユーティリティメソッドとして使用され、特定のインスタンスメンバー変数の値には依存しません。静的メソッドは、1 つのクラスのみに関連付けられているため、そのクラスのインスタンスメンバー変数の値にはアクセスできません。
静的変数は、要求の範囲内のみで静的です。サーバ全体、または全体組織においては、静的ではありません。
静的変数は、クラスの範囲内で共有される情報を保存する場合に使用します。同じクラスのすべてのインスタンスは、静的変数の 1 つのコピーを共有します。たとえば、同じトランザクションによって生成されるすべてのトリガは、関連するクラス内の静的変数を確認したり更新したりすることで、互いに通信することができます。再帰的なトリガが、再帰を終了するタイミングを判断するためにクラス変数の値を使うこともできます。
次のクラスがあるとします。
1swfobject.registerObject("clippy.codeblock-1", "9");
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17public class p {
18 public static boolean firstRun = true;
19}このクラスを使うトリガは、次のように、選択的にトリガの最初の実行を失敗することができます。
1swfobject.registerObject("clippy.codeblock-2", "9");
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17trigger t1 on Account (before delete, after delete, after undelete) {
18 if(Trigger.isBefore){
19 if(Trigger.isDelete){
20 if(p.firstRun){
21 Trigger.old[0].addError('Before Account Delete Error');
22 p.firstRun=false;
23 }
24 }
25 }
26}
27トリガで定義された静的変数の値は、同じトランザクション内の異なるトリガコンテキスト間 (たとえば、insert の呼び出し前と呼び出し後など) では保持されません。代わりにクラスに静的変数を定義し、トリガがこれらのクラスメンバー変数にアクセスして、静的値を確認できるようにします。
クラスの静的変数に、そのクラスのインスタンスを介してアクセスすることはできません。そのため、クラス C に静的変数 S があり、x が C のインスタンスの場合、x.S は不正な表現です。
次のインスタンスメソッドに関しても同じです。M() が静的メソッドの場合、x.M() は不正です。代わりに、作成するコードでは、クラス C.S および C.M() 使用して、それらの静的識別子を参照します。
ローカル変数がクラスネームと同じ名前の場合、これらのメソッドと変数は非表示になります。
内部クラスは、Java の静的な内部クラスのように機能しますが、static キーワードを要求しません。内部クラスは、外部クラスのようにインスタンスメンバー変数を持つことができますが、(this キーワードを使った) 外部クラスのインスタンスへの暗黙的ポインタはありません。
インスタンスメソッドと変数の使用
インスタンスメソッドとメンバー変数は、クラスのインスタンス、すなわちオブジェクトによって使用されます。インスタンスメンバー変数は、メソッド内ではなく、クラス内で宣言されます。インスタンスメソッドは通常、メソッドの動作に影響を与えるためにインスタンスメンバー変数を使用します。
二次元の点を集めるクラスを作成し、グラフ上に点をプロットするとします。次のスケルトンクラスでは、点のリストを保持するメンバー変数と、点の二次元リストを管理する内部クラスを使用します。
1swfobject.registerObject("clippy.codeblock-3", "9");
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17public class Plotter {
18
19 // This inner class manages the points
20 class Point {
21 Double x;
22 Double y;
23
24 Point(Double x, Double y) {
25 this.x = x;
26 this.y = y;
27 }
28 Double getXCoordinate() {
29 return x;
30 }
31
32 Double getYCoordinate() {
33 return y;
34 }
35 }
36
37 List<Point> points = new List<Point>();
38
39 public void plot(Double x, Double y) {
40 points.add(new Point(x, y));
41 }
42
43 // The following method takes the list of points and does something with them
44 public void render() {
45 }
46}
47初期化コードの使用
インスタンス初期化コードは、クラス内で定義される、次の形式のコードブロックです。
1{
2
3 //code body
4
5}クラス内のインスタンス初期化コードは、そのクラスからオブジェクトがインスタンス化されるたびに実行されます。これらのコードブロックは、コンストラクタの前に実行されます。
クラスに独自のコンストラクタを記述しない場合は、インスタンス初期化コードブロックを使用してインスタンス変数を初期化できます。ただし、たいていの場合はインスタンス初期化コードを使用せずに、変数にデフォルト値を設定するか、コンストラクタの本文を使用して初期化を行います。
静的初期化コードは、次のように、キーワード static の後に記述するコードブロックです。
1static {
2
3 //code body
4
5}他の静的コードと同様に、静的初期化コードブロックは、クラスの初回使用時に一度だけ初期化されます。
1 つのクラスに、静的初期化コードブロックまたはインスタンス初期化コードブロックのいずれかを、任意の数含めることができます。コード本文のどこに記述しても構いません。Java の場合と同様に、コードブロックはファイル内で表示される順番に実行されます。
静的なファイナル変数の初期化や、値の対応付けなどの静的な情報の宣言に静的初期化コードを使用できます。次に例を示します。
1swfobject.registerObject("clippy.codeblock-6", "9");
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17public class MyClass {
18
19 class RGB {
20
21 Integer red;
22 Integer green;
23 Integer blue;
24
25 RGB(Integer red, Integer green, Integer blue) {
26 this.red = red;
27 this.green = green;
28 this.blue = blue;
29 }
30 }
31
32 static Map<String, RGB> colorMap = new Map<String, RGB>();
33
34 static {
35 colorMap.put('red', new RGB(255, 0, 0));
36 colorMap.put('cyan', new RGB(0, 255, 255));
37 colorMap.put('magenta', new RGB(255, 0, 255));
38 }
39}