Apex のプロパティ
Apex プロパティは変数と似ていますが、アクセスまたは返される前に、プロパティ値にコードの内容を追加できます。プロパティを使用して、変更の前にデータを検証したり、データの変更 (他のメンバー変数値の変更など) の前にアクションを要求したり、別の提供元 (別のクラスなど) から取得したデータを表示したりできます。
- プロパティが読み込まれると、get アクセス機構内のコードが実行されます。
- プロパティが新しい値に割り当てられると、set アクセス機構内のコードが実行されます。
get アクセス機構のみを持つプロパティは、参照専用と考えられます。set アクセス機構のみを持つプロパティは、書き込み専用と考えられます。両方のアクセス機構を持つプロパティは、読み書き用と考えられます。
プロパティを宣言するには、クラスの本文内で次の構文を使用します。
1Public class BasicClass {
2
3 // Property declaration
4 access_modifier return_type property_name {
5 get {
6 //Get accessor code block
7 }
8 set {
9 //Set accessor code block
10 }
11 }
12}たとえば、次のクラスは、prop という名のプロパティを定義します。プロパティは public です。プロパティは integer データ型を返します。
1public class BasicProperty {
2 public integer prop {
3 get { return prop; }
4 set { prop = value; }
5 }
6}次のコードセグメントは、BasicProperty クラスをコールし、get および set アクセス機構を実施します。
1BasicProperty bp = new BasicProperty();
2bp.prop = 5; // Calls set accessor
3System.assertEquals(5, bp.prop); // Calls get accessor次の点に注意してください。
- get アクセス機構の本文は、メソッドの本文に似ています。プロパティ型の値を返します。get アクセス機構を実行することは、変数の値を読み取るのと同じことです。
- get アクセス機構は、リターンステートメント内で終わる必要があります。
- get アクセス機構が定義されているオブジェクトの状態を、get アクセス機構で変更しないことをお勧めします。
- set アクセス機構は、戻り値の型が void のメソッドに似ています。
- プロパティに値を割り当てると、新しい値を渡す引数と共に、set アクセス機構が呼び出されます。
- API バージョン 42.0 以降では、変数の値が set アクセス機構で設定されていない場合、その値を get アクセス機構で更新することはできません。
- set アクセス機構が呼び出されると、システムは、暗黙的な引数をプロパティと同じデータ型の value と呼ばれる setter に渡します。
- プロパティは、interface 上では定義できません。
- Apex プロパティは、C# のプロパティに基づいていますが、次の点が異なります。
- プロパティは、値のストレージを直接提供します。ストレージ値のためにサポーティングメンバーを作成する必要はありません。
- Apex 内に自動プロパティを作成できます。詳細は、「自動プロパティを使用する」を参照してください。
自動プロパティを使用する
プロパティでは、get または set アクセス機構のコードブロック内に追加コードは必要ありません。get および set アクセス機構のコードブロックを空白のままにして、自動プロパティを定義できます。自動プロパティによって、デバッグと保守が簡単な、簡潔なコードを記述できます。読み取り専用、読み書き用、書き込み専用として宣言可能です。次に、3 つの自動プロパティの例を示します。
1public class AutomaticProperty {
2 public integer MyReadOnlyProp { get; }
3 public double MyReadWriteProp { get; set; }
4 public string MyWriteOnlyProp { set; }
5}次のコードセグメントで、これらのプロパティを実行します。
1AutomaticProperty ap = new AutomaticProperty();
2ap.MyReadOnlyProp = 5; // This produces a compile error: not writable
3ap.MyReadWriteProp = 5; // No error
4System.assertEquals(5, ap.MyWriteOnlyProp); // This produces a compile error: not readable静的プロパティの使用
プロパティを static として宣言すると、そのプロパティのアクセス機構方式は、静的コンテキストで実行されます。そのため、そのアクセス機構に、クラスで定義されている非静的メンバー変数へのアクセス権はありません。次の例では、静的およびインスタンスプロパティの両方を持つクラスを作成します。
1public class StaticProperty {
2 private static integer StaticMember;
3 private integer NonStaticMember;
4
5 // The following produces a system error
6 // public static integer MyBadStaticProp { return NonStaticMember; }
7
8 public static integer MyGoodStaticProp {
9 get {return StaticMember;}
10 set { StaticMember = value; }
11 }
12 public integer MyGoodNonStaticProp {
13 get {return NonStaticMember;}
14 set { NonStaticMember = value; }
15 }
16}次のコードセグメントでは、静的およびインスタンスプロパティをコールします。
1StaticProperty sp = new StaticProperty();
2// The following produces a system error: a static variable cannot be
3// accessed through an object instance
4// sp.MyGoodStaticProp = 5;
5
6// The following does not produce an error
7StaticProperty.MyGoodStaticProp = 5;プロパティアクセス機構でのアクセス修飾子の使用
プロパティアクセス機構は、自身のアクセス修飾子で定義できます。アクセス機構が自身のアクセス修飾子を含む場合、この修飾子は、プロパティのアクセス修飾子より優先されます。個別のアクセス機構のアクセス修飾子は、プロパティ自身のアクセス修飾子より限定的である必要があります。たとえば、プロパティが public として定義されている場合、個別のアクセス機構は、global としては定義できません。クラス定義の例を次に示します。
1global virtual class PropertyVisibility {
2 // X is private for read and public for write
3 public integer X { private get; set; }
4 // Y can be globally read but only written within a class
5 global integer Y { get; public set; }
6 // Z can be read within the class but only subclasses can set it
7 public integer Z { get; protected set; }
8}