コンパイラが特別扱いしたと仮定して考えてみる。
コンパイラが Freezable なクラスのインスタンスに対する putfield 命令があれば、その前にそのインスタンスに対する frozen? を挿入すれば、実装できそう。だけど、それだと問い合わせのためのメソッドも必要になる。
ちなみに freeze するということはすべてのフィールドを (動的に) final にするという風に解釈しているんだけど、合ってる?
package java.lang; public class Object { : private boolean frozen = false; protected void freeze() throws FreezeNotSupportedException { if (this instanceof Freezable) { frozen = true; } else { throw new FreezeNotSupportedException(); } } public void isFrozen() { return frozen; } : }
public class Sample implements Freezable { private String str = "old string"; : { /* * Freezable なクラスのフィールドが書き換えられる場合は frozen? をコンパイラが挿入する。 */ if (isFrozen()) { throw new FrozenObjectException(); } /* * putfield 命令になりうる文 */ str = "new string"; } }
ちょっとだけ便利かもしれないが、isFrozen() の呼び出しコストとかで結局、無駄って言われそうなことになりそう。