主要内容

このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。

プロパティ値の検証

クラス定義でのプロパティの検証

MATLAB®プロパティ検証では,プロパティ値に特定の制限を課すことができます。検証を使用して,プロパティ値のクラスとサイズを制約することが可能です。また,関数を使用して,プロパティ値が準拠しなければならない基準を設定することもできます。MATLABでは一連の検証関数が定義されており、ユーザー独自の検証関数を記述することが可能です。

クラス定義でのプロパティ検証の使用はオプションです。

プロパティ検証の追加情報

プロパティ検証の詳細については,プロパティのクラスとサイズの検証プロパティの検証関数,およびプロパティ検証へのメタデータインターフェイスを参照してください。

検証構文

以下のコードの強調表示されている部分は,プロパティ検証の構文を示しています。

プロパティ検証には以下のすべてが含まれます。

  • サイズ——各次元の長さ。正の整数またはコロンで指定します。コロンは,その次元で任意の長さが許可されることを示します。プロパティに代入される値は、指定されたサイズに準拠するか、指定されたサイズに適合しなければなりません。詳細については、プロパティのサイズの検証を参照してください。

  • クラス——単一のMATLABクラスの名前。プロパティに代入される値は、指定されたクラスであるか、指定されたクラスに変換可能でなければなりません。任意の MATLAB クラス、または MATLAB でサポートされる、Java®クラスおよびCOMクラス以外の外部定義クラスを使用します。詳細については,プロパティのクラスの検証を参照してください。

  • 関数——検証関数名のコンマ区切りリスト。MATLABは,必要に応じてクラスとサイズの変換を適用した後、プロパティに代入された値を各検証関数に渡します。検証に失敗した場合、検証関数はエラーをスローしますが、値は返しません。詳細については、プロパティの検証関数を参照してください。

    MATLAB検証関数の一覧については,プロパティの検証関数を参照してください。

プロパティ検証の使用

ユーザーコードでプロパティに代入する値を制御するには,パブリックプロパティに対するプロパティ検証を使用してください。

プロパティ値を固定された識別子セットに制限する場合は,それらの識別子の列挙クラスを作成し,プロパティをこのクラスに制限します。列挙クラスの詳細については,列挙クラスの定義を参照してください。

プロパティ検証にはMATLABの型変換ルールが適用されます。たとえば、MATLABはある数値型を別の数値型に強制変換できます。そのため,プロパティ値を特定の数値型(双など)に制限しても,他の数値型をプロパティに代入できなくなることはありません。

プロパティに必ず特定の型の値のみが割り当てられるようにするには,目的の型変換のみをサポートする型にプロパティを制限するか,またはプロパティ型を指定する代わりに,検証関数を使用してプロパティに許可されるクラスを厳密に指定します。MATLABは,検証関数を実行する前に,型指定を評価します。詳細については,検証の順序を参照してください。

有効な既定値の指定

プロパティに割り当てられた既定値が,指定された検証の制約を満たしていることを確認してください。既定値を指定しないと,MATLABでは,指定されたクラスの空オブジェクトが割り当てられるか,サイズ制限で空の既定値を使用できない場合は,既定のコンストラクターを呼び出して,既定値が作成されます。既定のコンストラクターは,正しいサイズのオブジェクトを返さなければなりません。

プロパティ検証を使用するサンプルクラス

ValidatePropsクラスは検証用の3つのプロパティを定義します。

classdefValidateProps属性位置(1,3) double {mustBeReal, mustBeFinite}标签(: 1)字符{mustBeMember(标签,{‘高’,‘中等’,‘低’})}“低”状态(1,1) matlab.lang.OnOffSwitchState结束结束
  • 位置は,値が実数の有限数であるクラスの1行3列の配列でなければなりません。

  • 标签は,“高”“媒介”“低”のいずれかの字符ベクトルでなければなりません。

  • 状态は,matlab.lang.OnOffSwitchStateクラスの列挙メンバー(または)でなければなりません。

インスタンス化での検証

ValidatePropsクラスのオブジェクトを作成すると,暗黙的および明示的な既定値について検証が実行されます。

一个= ValidateProps
a = ValidateProps的属性:Location: [0 0 0] Label: 'Low' State: off

オブジェクトを作成すると,MATLABで次が行われます。

  • 位置プロパティ値を(0 0 0)に初期化してサイズとクラスの要件を満たす。

  • 标签プロパティを既定値“低”に設定する。既定値は許可された値セットのメンバーでなければなりません。字符の空の暗黙的な既定値は,エラーの原因になることがあります。

  • 状态プロパティをmatlab.lang.OnOffSwitchStateクラスで定義された列挙メンバーに設定する。

MATLABが既定値を選択する方法の詳細については,サイズおよびクラスごとの既定値を参照してください。

検証の順序

クラスの定義で指定される既定値を含め,値がプロパティに代入されるとき,MATLABは次の順序で検証を実行します。

  • クラスの検証——この検証では,クラス字符から字符串へなど,異なるクラスへの変換が発生することがあります。プロパティへの代入は、配列用の MATLAB 変換ルールに従います。

  • サイズの検証——この検証では,スカラー拡張や,列ベクトルから行ベクトルへの変換など,サイズの変換が発生することがあります。サイズの検証を指定するプロパティへの代入は,任意のMATLAB配列への代入と同じように動作します。インデックス付き代入の詳細については,配列インデックス付けを参照してください。

  • 検証関数——MATLABはクラスとサイズの検証結果を左から右の順序で各検証関数に渡します。すべての検証関数が呼び出される前にエラーが発生して検証プロセスが終了することがあります。

  • 设置メソッド——プロパティに対して设置メソッドが定義されている場合,MATLABはプロパティの设置メソッドを呼び出す前に,プロパティ検証を実行します。プロパティの设置メソッドまたは得到メソッド内でプロパティへの代入を行っても,再検証は適用されません。多くの場合,プロパティの设置メソッドは,プロパティ検証を使用して置換できます。

プロパティ検証エラー

ValuePropクラスはサイズ,クラスおよび関数の検証を使用して,价值プロパティへの代入が非負の双のスカラーであることを確認します。

classdefValueProp属性价值(1,1)双{mustBeNonnegative}= 0结束结束

このステートメントは,细胞配列をプロパティに代入しようとしています。この代入はクラスの検証に違反します。

a.Value = {10 20};
设置类“ValueProp”的属性“Value”时出错:数据类型无效。值必须为double或可转换为double。

このステートメントは,1行2列の双の配列をプロパティに代入しようとしています。この代入は,サイズの検証に違反します。

a.价值= [10 20];
设置类“ValueProp”的属性“Value”时出错:值的大小必须为标量。

このステートメントは,双のスカラーをプロパティに代入しようとしています。この代入は非負の数を必要とする関数の検証に失敗します。

a.Value = -10;
设置类“ValueProp”的属性“Value”时出错:Value必须是非负的。

この検証プロセスは,最初のエラーが発生した時点で終了します。

抽象プロパティの検証

抽象プロパティに対するプロパティ検証を定義できます。検証は,プロパティを実装するすべてのサブクラスに対して適用されます。ただし,サブクラスは,そのプロパティの実装に対していかなる検証も使用することができません。複数のクラスからプロパティの検証を継承する場合,1つのスーパークラスに含まれる単一の抽象プロパティによってのみ検証を定義できます。いずれのスーパークラスでも,プロパティを非抽象として定義することはできません。

検証の変更時に更新されないオブジェクト

クラスのオブジェクトが存在する間にプロパティ検証を変更しても,MATLABは新しい検証を既存のプロパティ値に適用しません。ただし,MATLABは既存のオブジェクトのプロパティへの代入を行うときに新しい検証を適用します。

読み込み操作中の検証

オブジェクトをファイルに保存するとき,MATLABはオブジェクトとともにプロパティのすべての非既定値を保存します。MATLABはオブジェクトを読み込むときに、新たに作成されるオブジェクトでこれらのプロパティ値を復元します。

クラス定義によりプロパティ検証が変更され,読み込まれたプロパティ値が有効でなくなってしまう場合,MATLABは現在そのプロパティに定義されている既定値を代用します。ただし,関数负载は既定値を現在のクラス定義から代入する前に発生する検証エラーを非表示にします。そのため,検証エラーは読み込み操作中に静的に無視されます。

この動作を説明するため,この例ではMonthTempクラスのオブジェクトの作成,保存,読み込みを行います。このクラスは,AveTempプロパティを细胞配列に制限します。

classdefMonthTemp属性AveTemp细胞结束结束

MonthTempオブジェクトを作成し,値をAveTempプロパティに代入します。

一个= MonthTemp;a.AveTemp = {“可能”70};

保存を使用してオブジェクトを保存します。

保存TemperatureFile一个

プロパティ定義を編集して,AveTempプロパティの検証クラスを细胞配列から容器。地图に変更します。

classdefMonthTemp属性AveTemp容器。地图结束结束

新しいクラス定義でMATLABパス上に保存したオブジェクトを読み込みます。プロパティ値は容器。地图オブジェクトでなければならないという現在の要件に细胞配列{‘可能’,70}が適合しないため,MATLABは保存された値をAveTempプロパティに代入できません。MATLABは cell 配列を容器。地图に変換できません。

この不適合に対処するために,MATLABは読み込まれたオブジェクトのAveTempプロパティを現在の既定値である空の容器。地图オブジェクトに設定します。

负载TemperatureFile一个a.AveTemp = Map属性:KeyType: char ValueType: any

保存された値が無効になったため,読み込まれたオブジェクトの値はAveTempプロパティに代入された値とは異なります。しかし,読み込みプロセスでは検証エラーが非表示になります。

クラス定義を変更してオブジェクトを再読み込みする際のデータの損失を回避するには,保存された値が現在のプロパティ検証の要件を満たせるようにするloadobjメソッドまたはクラスコンバーターメソッドを実装します。

オブジェクトの保存と読み込みの詳細については,オブジェクトの保存と読み込みのプロセスを参照してください。

関連するトピック