いけむランド

はてダからやってきました

freeze について考えてみる (2)

コンパイラが特別扱いしたと仮定して考えてみる。


コンパイラが 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() の呼び出しコストとかで結局、無駄って言われそうなことになりそう。