JavaやC言語にふれたことがあれば必ず目にするstatic修飾子ですが、Salesforce独自のプログラム言語であるApexにも存在しています。
なんとなく理解したつもりでいたのですが、改めて調べ直す機会があったので記録しておきます。

Apexにおける「static」
プログラムにおけるstaticとは何か、については「静的である」とか「インスタンス化せずに使用できる」などと説明されることが多いです。(詳しくわかりやすい説明をされているサイトはたくさんありますのでここでは省略します)
Apexの公式ドキュメントには以下のように記載されています。
静的メソッド、変数、および初期化コードには次の特性があります。
・クラスに関連付けられる。
・クラスが読み込まれたときにのみ初期化される。
開発中に2行目の初期化でつまずき、調べ直すきっかけとなりました。
起きたこと
トリガーのハンドラクラスを製造している際に、before/after両方で使用するクラス変数を用意していました。
beforeでトリガコンテキストのレコードを判定し値を更新し、クラス変数に格納、
afterでそのクラス変数のレコードの情報を次の処理へ渡すという処理を実装しようとしていました。
しかし何度実行しても、afterの箇所で期待している「値が更新されたレコード」が取得できません。
クラス変数を細かくデバッグしてみると、初期化したまま変数の中身が変わっていないことがわかりました。
ここで変数定義を見直すとstaticがついており、これが原因でした。
上段で紹介した通り、static変数はクラスが読み込まれたときにのみ初期化されるのでいくら処理中に初期化あるいは代入しても無意味だったのでした。
Javaとのちがい
せっかく公式ドキュメントを見直しているのでさらに読み進めていくと、Apex独自の特性が書かれていました。
静的変数は、Apex トランザクションの範囲内でのみ静的です。サーバー全体または組織全体で静的なわけではありません。静的変数の値は、1 回のトランザクションのコンテキスト内で保持され、トランザクションの境界を超えたときにリセットされます。たとえば、Apex DML 要求によってトリガーが何回も起動される場合、これらのトリガー呼び出しを通して静的変数は保持されます。
Apexの場合static変数はトランザクションごとに初期化されます。
Java系出身の方と話しているとき「それはstaticと言えるのか」と話題になりました。
知っていないと落とし穴になり兼ねないApexの仕様かもしれません。
さいごに
何気なく理解したつもりでいる修飾子たちでしたが、その意味やスコープされる範囲を正しく理解して使用しないと思わぬバグへとつながることを身をもって学びました。
今後とも気を付けていきたいと思います。