Main Content

可変ハンドルと不変値の列挙メンバー

ハンドルベースまたは値ベースの列挙型の選択

時間が経つにつれ状態が変化する可能性のあるオブジェクトのセットを列挙する場合は、ハンドル列挙型を使用します。値列挙型を使用して、抽象的 (かつ不変の) 値のセットを列挙します。ハンドル クラスと値クラスの詳細については、ハンドル クラスと値クラスの比較を参照してください。

値ベースの列挙クラス

値ベースの列挙クラスは固定されたセットの特定の値をもっています。プロパティの値を変更してこれらの値を変更します。そうすることで、この列挙クラスに対し固定された一連の値が拡張されるか変更されます。

継承されるプロパティ SetAccess は不変でなければならない

値ベースの列挙クラスは暗黙のうちにすべてのプロパティの SetAccess 属性を immutable として定義します。SetAccess 属性を他のいかなる値にも設定できません。

ただし、すべてのスーパークラス プロパティはプロパティ SetAccessimmutable として明示的に定義しなければなりません。

列挙メンバーは不変

値ベースの列挙クラスのインスタンスは、クラスがクリアされて再読み込みされるまで一意です。たとえば、次のクラスがあるとします。

classdef WeekDays
   enumeration
      Monday, Tuesday, Wednesday, Thursday, Friday
   end
end

MATLAB®ab を同等に考慮します。

a = WeekDays.Monday;
b = WeekDays.Monday;
isequal(a,b)
ans =

     1
a == b
ans =

     1

列挙メンバーのプロパティは不変

プロパティを定義する値ベースの列挙クラスは不変です。たとえば、Colors 列挙クラスは RGB 値をカラー名と関連付けます。

classdef Colors
   properties
      R = 0
      G = 0
      B = 0
   end
   methods
      function c = Colors(r,g,b)
         c.R = r; c.G = g; c.B = b;
      end
   end
   enumeration
      Red   (1, 0, 0)
      Green (0, 1, 0)
      Blue  (0, 0, 1)
   end
end

コンストラクターは入力引数をプロパティ RG、および B に割り当てます。

red = Colors.Red;
[red.R,red.G,red.B]
ans =

     1     0     0

プロパティ値を変更することはできません。

red.G = 1;
You cannot set the read-only property 'G' of Colors.

ハンドルベースの列挙クラス

プロパティを定義するハンドルベースの列挙クラスは可変です。クラスのインスタンスでプロパティ値を変更できるようにしなければならない場合は、列挙クラスを handle クラスから派生させます。

メモ

列挙クラスを matlab.mixin.Copyable から派生させることはできません。作成できるインスタンス数は列挙型ブロック内で定義された数に制限されるためです。

列挙メンバーは不変

プロパティをもつハンドルベースの列挙クラスの場合は、インスタンスのプロパティ値を変更すると、変更された値がそれを参照するすべてのインスタンスに反映されます。

たとえば、HandleColors 列挙クラスは RGB 値を前例の Colors クラスと同じカラー名に関連付けます。ただし、HandleColorshandle から派生します。

classdef HandleColors < handle
   properties
      R = 0
      G = 0
      B = 0
   end
   methods
      function c = HandleColors(r, g, b)
         c.R = r; c.G = g; c.B = b;
      end
   end
   enumeration
      Red   (1, 0, 0)
      Green (0, 1, 0)
      Blue  (0, 0, 1)
   end
end

HandleColors.Red のインスタンスを作成し、プロパティ R の値を返します。

a = HandleColors.Red;
a.R
ans =

    1

MATLAB は HandleColors.Red 列挙メンバーを作成します。これは、プロパティ R1 に、プロパティ G0 に、プロパティ B0 に設定します。

プロパティ R の値を 0.8 に変更します。

a.R = 0.8;

プロパティ R の値を 0.8 に設定後、HandleColors.Red のもうひとつのインスタンス b を作成します。

b = HandleColors.Red;
b.R
ans =

    0.8000

また、新しく作成されたインスタンスの R プロパティの値は 0.8 です。MATLAB セッションは常にどの列挙メンバーに対しても値を 1 つだけもちます。

ワークスペース変数をクリアしても、列挙メンバー HandleColors.Red の現在の定義は変わりません。

clear
a = HandleColors.Red;
a.R
ans =

    0.8000

HandleColors クラスの定義を再読み込みするために、クラスをクリアします。

clear classes
a = HandleColors.Red;
a.R
ans =

     1

与えられたプロパティ値の再割り当てを回避するには、そのプロパティの SetAccess 属性を immutable に設定します。

ハンドルベースの列挙型の等式

2 つの変数を特定の列挙メンバーに割り当てます。

a = HandleColors.Red;
b = HandleColors.Red;

isequal を使用して ab を比較します。

isequal(a,b)
ans =

     1

ab のプロパティ値は同じです。そのため、isequaltrue を返します。ただし、列挙クラスではないハンドル クラスとは異なり、列挙メンバーは 1 つだけなので ab は同じハンドルです。== (ハンドル eq メソッド) を使用して、ハンドル等式を決定します。

a == b
ans =

     1

ハンドルと併用するときに isequal== がどのように異なるかの詳細については、handle eq メソッドを参照してください。

列挙型を使用して状態を表す

MachineState クラスは 2 つの列挙メンバーを定義して、マシンの稼動中と停止中の状態を表します。

classdef MachineState
   enumeration
      Running
      NotRunning
   end   
end

Machine クラスは起動と停止の操作でマシンを表します。eqchar メソッドにより MachineState 列挙型の使用は簡単になり、その結果コードも読みやすくなります。

classdef Machine < handle
   properties (SetAccess = private)
      State = MachineState.NotRunning
   end
   
   methods
      function start(machine)
         if machine.State == MachineState.NotRunning
            machine.State = MachineState.Running;
         end
         disp (machine.State.char)
      end
      function stop(machine)
         if machine.State == MachineState.Running
            machine.State = MachineState.NotRunning;
         end
         disp (machine.State.char)
      end
   end
end

Machine オブジェクトを作成し、startstop メソッドを呼び出します。

m = Machine;
m.start
Running
m.stop
NotRunning

関連するトピック