クラスメソッド
メソッドを定義するには、次を指定します。
- 省略可能: public や protected などの修飾子。
- 必須: String や Integer など、メソッドが返す値のデータ型。メソッドが値を返さない場合は、void を使用します。
- 必須: カンマで区切られたメソッドの入力パラメータのリスト。括弧 () で囲まれます。各パラメータの前にデータ型を指定します。パラメータがない場合は、1 組の空の括弧を使用します。メソッドに指定できるパラメータは 32 個までです。
- 必須: 中括弧 {} で囲まれたメソッドの本文。ローカル変数宣言を含めたメソッドのすべてのコードがここに含まれます。
メソッドを定義するには、次の構文を使用します。
1[public | private | protected | global] [override] [static] data_type method_name
2(input parameters)
3{
4// The body of the method
5}次に例を示します。
1public static Integer getInt() {
2 return MY_INT;
3 }Java の場合と同様に、結果が別の変数に割り当てられない場合、値を返すメソッドもステートメントとして実行できます。
ユーザ定義メソッド
- システムメソッドが使用されている任意の場所で使用できます。
- 再帰可能です。
- sObject ID を初期化する DML insert ステートメントなど、悪影響がある可能性があります。「Apex DML ステートメント」を参照してください。
- ユーザ定義メソッド自体または同じクラスまたは匿名ブロックで後で定義されたメソッドを参照できます。Apex は、2 つのフェーズでメソッドを解析します。そのため、事前の宣言は必要ありません。
- 多相的な実装が可能です。たとえば、example というメソッドは、1 つの integer パラメータを使用する場合と、2 つの integer パラメータを使用する場合の、2 とおりの方法で実装できます。Apex のパーサーは、メソッドが 1 つの integers でコールされるか 2 つの interger でコールされるかによって適切な実装を選択して実行します。パーサーで完全一致を検出できない場合、データ型の強制規則を使用して、おおよその一致を検索します。データ変換の詳細は、「変換の規則」を参照してください。
- 副次的影響のある void メソッドを使用する場合、ユーザ定義メソッドは、通常、Apex コードのスタンドアロンの手順のステートメントとして実行されます。次に例を示します。
1System.debug('Here is a note for the log.'); - 結果が別の変数に割り当てられない場合、戻り値をステートメントとして実行するステートメントを指定できます。このルールは Java と同じです。
値によってメソッド引数を渡す
Apex では、Integer または String などのすべてのプリミティブデータ型引数は、値によってメソッドに渡されます。つまり、引数への変更はメソッドの範囲内でのみ存在することになります。メソッドが返ったときに、その引数への変更は失われます。
sObject などの非プリミティブデータ型引数は、参照によってメソッドに渡されます。つまり、メソッドが返ったときに、渡された引数はメソッドをコールする前と同じオブジェクトをそのまま参照することになり、別のオブジェクトを参照するようには変更できません。ただし、オブジェクトの項目の値はメソッド内で変更できます。
メソッドにプリミティブデータ型と非プリミティブデータ型を渡す例を次に示します。
例: プリミティブデータ型引数を渡す
この例では、String 型のプリミティブ引数が値によって別のメソッドに渡されることを示します。この例の debugStatusMessage メソッドは、String 変数 msg を作成して値を割り当てます。次に、この変数を引数として別のメソッドに渡し、この String の値を変更します。ただし、String はプリミティブ型のため、値によって渡され、メソッドが返ったときに、元の変数 msg の値は変更されていません。assert ステートメントは、msg の値が古い値のままであることを確認します。
1public class PassPrimitiveTypeExample {
2 public static void debugStatusMessage() {
3 String msg = 'Original value';
4 processString(msg);
5 // The value of the msg variable didn't
6 // change; it is still the old value.
7 System.assertEquals(msg, 'Original value');
8 }
9
10 public static void processString(String s) {
11 s = 'Modified value';
12 }
13}例: 非プリミティブデータ型引数を渡す
この例では、List 引数を値によって別のメソッドに渡し、変更できる方法を示します。また、List 引数は別の List オブジェクトを参照するようには変更できないことも示します。最初に、createTemperatureHistory メソッドで変数 fillMe (Integer の List) を作成し、その変数を別のメソッドに渡します。コールされたメソッドは、丸められた温度値を表す Integer 値をこの List に入力します。メソッドが返ったときに、元の List 変数が変更されていて現在 5 つの値が含まれていることを assert で確認します。次に、2 番目の List 変数 createMe を作成し、別のメソッドに渡します。コールされたメソッドは、渡された引数を新しい Integer 値を含む新しく作成された List に割り当てます。メソッドが返ったときに、元の createMe 変数は新しい List は参照せず、元の空の List を参照します。assert で createMe に値が含まれないことを確認します。
1public class PassNonPrimitiveTypeExample {
2
3 public static void createTemperatureHistory() {
4 List<Integer> fillMe = new List<Integer>();
5 reference(fillMe);
6 // The list is modified and contains five items
7 // as expected.
8 System.assertEquals(fillMe.size(),5);
9
10 List<Integer> createMe = new List<Integer>();
11 referenceNew(createMe);
12 // The list is not modified because it still points
13 // to the original list, not the new list
14 // that the method created.
15 System.assertEquals(createMe.size(),0);
16 }
17
18 public static void reference(List<Integer> m) {
19 // Add rounded temperatures for the last five days.
20 m.add(70);
21 m.add(68);
22 m.add(75);
23 m.add(80);
24 m.add(82);
25 }
26
27 public static void referenceNew(List<Integer> m) {
28 // Assign argument to a new List of
29 // five temperature values.
30 m = new List<Integer>{55, 59, 62, 60, 63};
31 }
32}