Main Content

プロパティ値の初期化

プロパティ値を初期化するための基本的な手法は、2 つあります。

  • 既定値をもつプロパティを定義する — MATLAB® では、すべてのインスタンスのプロパティに同じ初期値が代入されます。

  • コンストラクター内でプロパティ値を設定する — コンストラクターが各インスタンスの代入ステートメントを評価することで、インスタンスは一意の初期プロパティ値をもつことができます。

既定値をもつプロパティの定義

値または式を使用して、既定値を個々のプロパティに代入できます。式に変数を含めることはできません。この例では、プロパティの既定値を定義する方法をいくつか説明します。

classdef PropExample
   properties
      Prop1
      Prop2 = "some text"
      Prop3 = sin(pi/12)
      Prop4 = datetime.empty 
      Prop5 (1,1) double {mustBePositive} = 1
   end
end
  • Prop1 — プロパティ定義で既定値が指定されていないため、MATLAB によりプロパティ値が空の double ([]) に初期化されます。

  • Prop2 — 既定値は string スカラー "some text" です。

  • Prop3 — 既定値は sin(pi/12) の値です。このプロパティを読み取ると、式そのものではなく、評価された式 (0.2588) が返されます。

    既定値として代入する式の評価の詳細については、クラス定義内の式の評価およびオブジェクトを含んだプロパティを参照してください。

  • Prop4 — 既定値は空の datetime オブジェクトです。

  • Prop5 — 既定値は 1 で、一般的なプロパティ値はスカラーの正の double に制限されます。プロパティ定義でプロパティ値に対してサイズ、クラス、検証関数の制限が指定されている場合、既定値はこれらの条件を満たさなければなりません。たとえば、既定値が 0 の場合、mustBePositive を満たしていないため、インスタンス化中にエラーが発生します。

    サイズ、クラス、および検証関数に基づいたプロパティの制限の詳細については、プロパティ値の検証を参照してください。

メモ

MATLAB では、プロパティ値が最初に必要になったときに (クラスが最初にインスタンス化されるときなど)、既定の式が評価されます。その後、クラスのすべてのインスタンスに対して同じ既定値が使用されます。MATLAB では、クラス定義がメモリからクリアされるまで既定の式は再評価されません。

既定のプロパティ値としてのオブジェクトの処理

ハンドル クラス コンストラクターを使用して既定のプロパティ値を作成すると、MATLAB では、クラスの初回使用時にのみコンストラクターが呼び出され、その後はすべてのインスタンスで、同じオブジェクト ハンドルがプロパティの既定値として使用されます。すべてのオブジェクト ハンドルが同じオブジェクトを参照するため、1 つのインスタンスのハンドル オブジェクトを変更すると、それがすべてのインスタンスのハンドル オブジェクトに反映されます。クラスをインスタンス化するたびにプロパティ値をハンドル オブジェクトの新しいインスタンスで初期化するには、コンストラクター内でプロパティ値を代入します。

コンストラクターでのプロパティ値の設定

クラス コンストラクター内からプロパティに値を代入するには、コンストラクターが返すオブジェクト (出力変数 obj) と、ドット表記を使用するプロパティ名を参照します。

classdef MyClass
   properties
      Prop1
   end
   methods
      function obj = MyClass(intval)
         obj.Prop1 = intval;
      end
   end
end

クラス コンストラクター内で値をプロパティに代入すると、作成した各オブジェクトについて、MATLAB により代入ステートメントが評価されます。そのプロパティに対し各オブジェクトに一意の値が含まれるようにする場合は、コンストラクターでプロパティ値を代入します。

たとえば、ContainsHandle は、クラス MyHandleClass の一意のハンドル オブジェクトを各インスタンスの Prop1 に代入します。ContainsHandle は、それ自体のコンストラクターから MyHandleClass コンストラクターを呼び出すことでこの処理を行います。

classdef ContainsHandle
   properties
       Prop1
   end
   methods
       function obj = ContainsHandle(keySet,valueSet)
           obj.Prop1 = MyHandleClass(keySet,valueSet);
       end
   end
end

コンストラクター メソッドの詳細については、コンストラクターのオブジェクトの参照を参照してください。

構築前のプロパティの検証

MATLAB では、コンストラクターで値が代入される前にプロパティの既定値が検証されます。properties ブロックで代入された既定値と、クラス コンストラクターでプロパティに設定された値は、指定された検証を満たす必要があります。たとえば、PropInitProp をスカラーの正の double に制限しますが、既定値は代入しません。既定では、MATLAB により空の double の初期値が代入されます。

classdef PropInit
    properties
        Prop (1,1) double {mustBePositive} 
    end
    methods
        function obj = PropInit(positiveInput)
            obj.Prop = positiveInput;
        end
    end
end

クラス コンストラクターを Prop に対する有効な値で呼び出しても、Prop に空の double の初期値が含まれるため、エラーが発生します。空の double は、検証関数 mustBePositive を満たしません。

obj = PropInit(2);
Error using implicit default value of property 'Prop' of class 'PropInit':
Value must be positive.

この問題を回避するには、コンストラクター内で既定値を上書きする予定であっても、検証を満たす既定値をプロパティに含める必要があります。

関連するトピック