7.1.7. Make-InstanceとInitialize-Instanceの宣言
ジェネリック関数make-instance
は、最適化を考えない場合は、 下記に示す宣言のように実行されます。
defmethod make-instance ((class standard-class) &rest initargs)
(
...let ((instance (apply #'allocate-instance class initargs)))
(apply #'initialize-instance instance initargs)
(
instance))
defmethod make-instance ((class-name symbol) &rest initargs)
(apply #'make-instance (find-class class-name) initargs)) (
make-instance
の定義で省かれているコードは、 initargs
をデフォルト初期化引数によって指定する部分であり、 また初期化引数の結果を 初期化引数に設定するかどうか決定するために、 スロットに値が設定されておらず、 メソッドの引数として供給もされていないかどうかをチェックする部分となります。
ジェネリック関数initialize-instance
は、最適化を考えない場合は、 下記に示す宣言のように実行されます。
defmethod initialize-instance ((instance standard-object) &rest initargs)
(apply #'shared-initialize instance t initargs)) (
これらのコードはカスタマイズ可能です。
プログラマーへのインターフェイスレベルとしてカスタマイズできるものは、 defclass
のオプションである、:initform
, :initarg
, そして:default-initargs
が含まれますし、 同様にmake-instance
, allocate-instance
, そしてinitialize-instance
のメソッド宣言があげられます。 shared-initialize
のメソッドを定義することも可能です。 この関数は、ジェネリック関数のreinitialize-instance
, update-instance-for-redefined-class
, update-instance-for-different-class
, そしてinitialize-instance
によって実行されます。 メタオブジェクトレベルでは、追加でカスタマイズをサポートします。
処理系は、initialize-instance
とshared-initialize
について 明確な最適化を許容しています。 7章にあるshared-initialize
の定義では、可能な最適化についての説明があります。