Apexコードの概要に詳しく記載されていますが、そこから抜粋して要点をまとめてみました。Javaにすごーく似ているけれどそうじゃないApexについてです。
大文字と小文字は区別なし
Java や C# と似て、クラス、インターフェース、定数、クラス変数、アノテーションなどがあるが、コードでは、大文字と小文字は区別しない。
// インターフェースの利用 public interface PurchaseOrder { Double discount(); } public class CustomPurchaseOrder implements PurchaseOrder { static final Integer DEFAULT_DISCOUNT = .05; // 定義の仕方は独特 public Double discount() { return DEFAULT_DISCOUNT; } } // インターフェースを利用したインスタンスの生成 PurchaseOrders po = new CustomPurchaseOrder();
this、instanceOf などの Java に似たキーワードをサポート。
データ型
- Integer、Date などのプリミティブデータ型
- 永続オブジェクトであることを示す sObject 型
- コレクション型、列挙型
- ユーザまたはシステムによって定義された Apexクラス
プリミティブデータ型
- Blob (バイナリデータを格納)
- Boolean
- Date、Time、Datetime
- Decimal (通貨などの任意精度の数値用)
- ID (Force.com データベースレコードの識別子型)
- Integer、Long、Double、String
DateTime dt = System.now() + 1; Boolean mustI = true; String s = 'abc'.toUpperCase(); // String型は、二重引用符ではなく一重引用符 Decimal d = Decimal.valueOf('123'); // Integerのような定義ではない
コレクション型
Set は、プリミティブ型の集合で順序の指定はなく、要素の重複は許されない。
Set<String> s = new Set<String>{'a','b', 'c'}; // 定義の仕方は独特 s.add('c'); System.assert(s.contains('b')); System.assert(s.size() == 3);
List は、要素の集合。要素間の順序を保持したい場合に使用し、要素の重複は許される。
List<Integer> myList = new List<Integer>(); myList.add(47); myList.get(0);
List では配列構文を使用可能!
String [] colors = new List<String>(); colors[3] = 'Green';
Mapは、キーと値のペアの集合
Map<String,String> myStrings = new Map<String,String>{'a'=>'b','c'=>'d'.toUpperCase()}; // Contact オブジェクトから、id 項目および lastname 項目の値のみを取得してセット Map<ID,Contact> m = new Map<ID, Contact>([select id, lastname from contact]);
列挙型
// Season という新しいデータ型を作成し、このデータ型の変数を宣言して値を代入 public enum Season {WINTER, SPRING, SUMMER, AUTUMN} Season s = Season.AUTUMN;
ループ処理
Integer count = 1; while (count < 11) { System.debug(count); count++; }
for (Integer i = 0, j = 0; i < 10;i++){ System.debug(i+1); }
Integer[] myInts = new Integer[]{1,2,3,4,5,6,7,8,9,10}; for (Integer i : myInts) { // 独特、PHPでいうforeach? System.debug(i); }
String s = 'Acme'; for (Account a : [select id, name from account where name like :(s+'%')]){ //Your code }
例外
throw、try、catch、finally もある。
try { throw new Exception(); } catch(ListException e) { } catch(Exception e) { }
アノテーション
Apex は 2 種類のアノテーションをサポートしている。カスタムのアノテーションを作成することはできない。
- @future:非同期的に実行されるメソッドを示す。
- @isTest:すべてのメソッドがテストメソッドであることを示す
getter、setter
2つは同義らしい。。。
public Integer prop { get { return prop * 2; } set { prop = value; } }
public Integer anotherProp {get;set;}
データベース連携
Salesforceではデータベースのテーブルをオブジェクトという概念で扱うので、Apexからは、データベースオブジェクト (sObject) を作成して、登録したり、更新したり、viewのVisualforceのページに表示するために保持したりする。
// sObjectの作成(インスタンスの生成) sObject s = new Account(); Account a = new Account(name='Acme', billingCity='Edinburgh'); // データを登録(insert) insert a; // データの参照 ID id = a.ID; String x = a.name; String x = a.get('name');
クエリ
2種類のクエリ言語をサポートしている。
- Salesforce Object Query Language (SOQL) : クエリ専用の言語
- Salesforce Object Search Language (SOSL) : 検索を実行するシンプルな言語
sObject s = [select id, name from account where name='Acme'];
String myName = 'Acme'; Account [] accts = [select ID from Account where name=:myName];
Double rev= [select annualRevenue from Account where name = 'Acme'][0].annualRevenue;
Contact c= [select Account.name from Contact where id =:id];
// SOSL ステートメント List<List<SObject>> searchList= [FIND 'map*' IN NAME FIELDS RETURNING Account (id, name),Contact]; Account [] accounts = ((List<Account>)searchList[0]); Contact [] contacts = ((List<Contact>)searchList[1]);