問題
dowork() メソッドを呼び出す際に使用できるコードセグメントはどれですか。
- For(Trigger.isInsert t: Trigger.new) { dowork(); }
- If(Trigger.isInsert) dowork();
- If(Trigger.isRunning) dowork();
- For(Trigger.isRunning t: Trigger.new) { dowork(); }
正解
- For(Trigger.isInsert t: Trigger.new) { dowork(); }
- If(Trigger.isInsert) dowork();
- If(Trigger.isRunning) dowork();
- For(Trigger.isRunning t: Trigger.new) { dowork(); }
解説
この問題を解くための主な手掛かりと解き方を以下にまとめます:
- 手掛かり: メソッドの呼び出し
すべての選択肢にdowork();
というメソッドの呼び出しが含まれています。このメソッドを特定の条件下で呼び出したいので、制御文を正しく使用する必要があります。 - 手掛かり: Triggerのプロパティ
選択肢にはTrigger.isInsert
とTrigger.isRunning
というTriggerのプロパティが含まれています。しかし、Trigger.isRunning
はApexの公式ドキュメントに存在しないプロパティです。 - 解き方: 制御文の文法を確認
- 最初の選択肢と最後の選択肢は、forループを使用しています。しかし、forループはコレクションを反復処理する場合に使用されるものです。
Trigger.isInsert
はboolean型のプロパティであるため、forループの中で直接使用することはできません。 - 2つ目の選択肢は、if文を使用しています。if文は条件がtrueの場合にブロック内のコードを実行するためのものです。
Trigger.isInsert
はレコードが挿入された場合にtrueになるプロパティであるため、この選択肢は正しいと考えられます。 - 3つ目の選択肢は
Trigger.isRunning
を使用していますが、これは存在しないプロパティであるため、この選択肢は間違いです。
- 最初の選択肢と最後の選択肢は、forループを使用しています。しかし、forループはコレクションを反復処理する場合に使用されるものです。
上記の手掛かりと解き方を組み合わせると、If(Trigger.isInsert) dowork();
が正しい選択肢であると判断できます。
それぞれの選択肢の理由について説明します。
□ For(Trigger.isInsert t: Trigger.new) { dowork(); }
これは不正解です。Trigger.isInsert
はbooleanのプロパティであり、forループの初期化部分で変数に代入することはできません。また、For(Trigger.isInsert t: Trigger.new)
という文法自体が正しくありません。正しくはforループ内で、コレクションから要素を取り出す形(例: for(SObject t : Trigger.new)
)となりますが、このコードではTrigger.isInsert
というbooleanプロパティを変数t
に代入しようとしています。
□ If(Trigger.isInsert) dowork();
これは正解です。Trigger.isInsert
は、現在のトリガーがInsert操作の際に実行されているかを示すbooleanのプロパティです。したがって、これがtrueの場合、dowork()
メソッドが呼び出されます。
□ If(Trigger.isRunning) dowork();
これは不正解です。Trigger.isRunning
というプロパティはApexのTriggerコンテキストには存在しません。したがって、このコードはエラーとなります。
□ For(Trigger.isRunning t: Trigger.new) { dowork(); }
これは不正解です。前述の通り、Trigger.isRunning
というプロパティは存在しないため、このコードはエラーとなります。さらに、Trigger.isRunning
をforループの初期化部分で変数に代入するという文法も不正確です。
参考:トリガーコンテキスト変数
コメント