📢 Attention Salesforce Certified Trailblazers! Maintain your credentials and link your Trailhead and Webassessor accounts by April 19th. Learn more.
close

Apex の使用開始

学習の目的

この単元を完了すると、次のことができるようになります。
  • Apex プログラミング言語の主要な機能を説明する。
  • Apex クラスを保存し、匿名 Apex を使用してメソッドをコールする。
  • 開発者コンソールを使用してデバッグログを調査する。

Apex の使用開始

Apex は、Java に似た構文を使用し、データベースのストアドプロシージャのように動作するプログラミング言語です。Apex では開発者がビジネスロジックを、ボタンのクリック、関連レコードの更新、Visualforce ページなどのシステムイベントに追加できます。

Apex は、言語として次の特徴があります。

  • ホスティング — Apex は、サーバ (Lightning Platform) 上で保存、コンパイル、および実行されます。
  • オブジェクト指向 — Apex は、クラス、インターフェース、および継承をサポートします。
  • 強い型付け — Apex は、コンパイル時にオブジェクトへの参照を検証します。
  • マルチテナント型 — Apex はマルチテナントプラットフォームで実行されるため、制限を適用して回避コードを厳密に防止してコードが共有リソースを独占しないようにします。
  • データベースとの統合 — レコードに簡単にアクセスして操作できます。Apex では、レコードとその項目に直接アクセスできます。また、それらのレコードを操作するためのステートメントとクエリ言語が提供されます。
  • データ指向 — Apex では、データベースへのトランザクションアクセスが提供されるため、ロールバック操作が可能です。
  • 使いやすさ — Apex は、使い慣れた Java イディオムに基づいています。
  • テストしやすさ — Apex には、単体テストの作成、実行、およびコードカバー率のサポートが組み込まれています。Salesforce では、プラットフォームのアップグレードの前にすべての単体テストを実行することによって、すべてのカスタム Apex コードが期待どおりに動作することを確認しています。
  • バージョン管理 — カスタム Apex コードは、異なるバージョンの API に対して保存できます。
Apex はクラウドベースのプログラミング言語です。

Apex 言語の特長

他のオブジェクト指向プログラミング言語と同様に、Apex では次のような言語構成要素がサポートされます。

  • クラス、インターフェース、プロパティ、コレクション (配列を含む)
  • オブジェクトおよび配列表記
  • 式、変数、定数
  • 条件付きステートメント (if-then-else) とフロー制御ステートメント (for ループと while ループ)

他のオブジェクト指向プログラミング言語とは異なり、Apex では次の機能がサポートされます。

  • クラウド開発 (Apex はクラウドで保管、コンパイル、および実行されるため)
  • トリガ (データベースシステムのトリガと類似)
  • 直接データベースコールが可能なデータベースステートメントと、データのクエリと検索を行うためのクエリ言語
  • トランザクションとロールバック
  • global アクセス修飾子 (public 修飾子よりも権限が高く、名前空間とアプリケーションの全体でアクセスが可能)
  • カスタムコードのバージョン管理

さらに、Apex では大文字と小文字が区別されません。

開発ツール

ブラウザから Salesforce ユーザインターフェースを使用して Apex を記述し、デバッグ情報に直接アクセスできます。自分の名前 の下にある開発者コンソールまたはクイックアクセスメニュー (設定ギアアイコン) を開きます。

また、Force.com IDE plugin for Eclipse を使用して、クライアント上で Apex を作成することもできます。Salesforce 開発者サイトの「Force.com IDE」を参照してください。

データ型の概要

Apex では、Salesforce 固有のデータ型 (sObject データ型) を含む、さまざまなデータ型がサポートされます。

Apex では、次のデータ型がサポートされます。

  • Integer、Double、Long、Date、Datetime、String、ID、Boolean などのプリミティブ。
  • sObject。汎用 sObject または特定の sObject (Account、Contact、MyCustomObject__c など) のいずれかになります (sObject については後の単元で学習します)。
  • 次のものを含むコレクション
    • プリミティブ、sObject、ユーザ定義のオブジェクト、Apex クラスから作成されたオブジェクト、またはコレクションのリスト (または配列)
    • プリミティブのセット
    • プリミティブからプリミティブ、sObject、またはコレクションへの対応付け
  • 列挙と呼ばれる型付けされた値のリスト
  • ユーザ定義の Apex クラス
  • システムが提供する Apex クラス

Apex コレクション: List

List は、順序付けされたオブジェクトのコレクションです。Apex の List は配列と同義で、この 2 つは互いに代替できます。

次の 2 つの宣言は同等です。colors 変数が List 構文を使用して宣言されています。

List<String> colors = new List<String>();

または、colors 変数は配列として宣言できますが、配列ではなく List に割り当てられています。

String[] colors = new List<String>();

一般に、List では割り当てが必要な要素数を事前に決定する必要がないため、配列よりも List の方が作成が容易です。

List への要素の追加は、リスト作成時でも、リスト作成後に add() メソッドをコールしても行うことができます。最初の例は、要素を List に追加する 2 つの方法を示します。

// Create a list and add elements to it in one step
List<String> colors = new List<String> { 'red', 'green', 'blue' };

// Add elements to a list after it has been created
List<String> moreColors = new List<String>();
moreColors.add('orange');
moreColors.add('purple');

List 要素は、配列要素と同様に、角括弧で囲まれたインデックスを指定することで読み込めます。また、get() メソッドを使用して List 要素を読み込むこともできます。次の例は、前の例で作成されたリストに基づいており、いずれかのメソッドを使用して List 要素を読み込む方法を示します。また、配列要素の反復処理方法も示します。

// Get elements from a list
String color1 = moreColors.get(0);
String color2 = moreColors[0];
System.assertEquals(color1, color2);

// Iterate over a list to read elements
for(Integer i=0;i<colors.size();i++) {
    // Write value to the debug log
    System.debug(colors[i]);
}

中級編

Apex は、他にも 2 つのコレクション型、Set と Map がサポートされます。これらの型については、『Apex 開発者ガイド』「Collections」セクションを参照してください。

Apex クラス

Apex クラスの利点の 1 つはコードを再利用できることです。クラスメソッドは、トリガと他のクラスからコールできます。以降のチュートリアルでは、サンプルのクラスを組織に保存し、そのクラスを使用してメールを送信して、デバッグログを調べます。

Apex クラスを保存する

EmailManager クラスを組織に保存します。

  1. 自分の名前 の下にある開発者コンソールまたはクイックアクセスメニュー (設定ギアアイコン) を開きます。
  2. 開発者コンソールで、[File (ファイル)] | [New (新規)] | [Apex Class (Apex クラス)] をクリックし、クラス名に「EmailManager」と入力し、[OK] をクリックします。
  3. デフォルトのクラス本文をサンプルの EmailManager クラスで置き換えます。

    EmailManager クラスには、メールを送信し、Apex クラスライブラリの組み込みメッセージメソッドを使用する公開メソッド (sendMail()) が含まれます。また、このクラスには非公開ヘルパーメソッド (inspectResults()) があります。これは非公開でクラス内でのみ使用されるため外部からはコールできません。このヘルパーメソッドは、メール送信コールの結果を検査するもので、sendMail() からコールされます。

    public class EmailManager {
    
        // Public method
        public void sendMail(String address, String subject, String body) {
            // Create an email message object
            Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
            String[] toAddresses = new String[] {address};
            mail.setToAddresses(toAddresses);
            mail.setSubject(subject);
            mail.setPlainTextBody(body);
            // Pass this email message to the built-in sendEmail method 
            // of the Messaging class
            Messaging.SendEmailResult[] results = Messaging.sendEmail(
                                     new Messaging.SingleEmailMessage[] { mail });
            
            // Call a helper method to inspect the returned results
            inspectResults(results);
        }
        
        // Helper method
        private static Boolean inspectResults(Messaging.SendEmailResult[] results) {
            Boolean sendResult = true;
            
            // sendEmail returns an array of result objects.
            // Iterate through the list to inspect results. 
            // In this class, the methods send only one email, 
            // so we should have only one result.
            for (Messaging.SendEmailResult res : results) {
                if (res.isSuccess()) {
                    System.debug('Email sent successfully');
                }
                else {
                    sendResult = false;
                    System.debug('The following errors occurred: ' + res.getErrors());                 
                }
            }
            
            return sendResult;
        }
    
    }
  4. Ctrl キーを押しながら S キーを押してクラスを保存します。

    中級編

    保存したクラスでは、オブジェクト指向プログラミング (OOP) を利用します。このクラスは、メールの管理に関連するメソッドをカプセル化します。完全な OOP の例にするには、クラスにメンバー変数 (属性) とそれらの属性にアクセスするためのアクセス機構メソッドも含める必要がありますが、ここでは簡略化のために省略しています。

    クラスを保存すると Salesforce によってクラスがコンパイルされます。

メソッドをコールしてメールを送信する

公開メソッドを呼び出しましょう。ここでは、匿名 Apex 実行を使用して呼び出します。匿名 Apex を使用すると、コード行をその場で実行でき、特に機能のテストなどで Apex を呼び出す場合に便利です。他の Apex 実行と同様に、結果としてデバッグログが生成されます。

メモ

メモ

トリガを使用するなど、他にも Apex を呼び出す方法があります。トリガの詳細については、別のモジュールで学習します。

  1. 開発者コンソールで、[Debug (デバッグ)] | [Open Execute Anonymous Window (匿名実行ウィンドウを開く)] をクリックします。
  2. 開いたウィンドウで、次の情報を入力します。'Your email address' を自分のメールアドレスで置き換えます。
    EmailManager em = new EmailManager();
    em.sendMail('Your email address', 'Trailhead Tutorial', '123 body');
    
  3. [Execute (実行)] をクリックします。

    このメソッドが実行されたので、受信トレイにメールが届いているはずです。メールを確認してみましょう。

デバッグログを調べる

デバッグログは、コードをデバッグするのに便利です。Apex メソッドが実行されると、コールはデバッグログに記録されます。また、独自のデバッグメッセージをログに書き出すことができ、エラーがある場合のコードのデバッグに役立ちます。sendMail() からコールされる inspectResults() ヘルパーメソッドは、System.debug() を使用して、メール送信操作が成功したかエラーになったかを示すメッセージをログに書き出します。メソッドを実行したときに生成されたデバッグログでこれらのメッセージを検索できます。

  1. 開発者コンソールの [Logs (ログ)] タブをクリックし、リストの最新のログをダブルクリックします。
  2. [Debug Only (デバッグのみ)] を選択して、System.debug() ステートメントのログ行のみが表示されるようにログを絞り込みます。
    開発者コンソールでデバッグメッセージが表示されるようにデバッグログを絞り込む
    メモ

    メモ

    また、[Filter (絞り込み条件)] 項目にキーワードを入力して検索するか、その他いずれかのオプションを選択して、デバッグログを絞り込むこともできます。詳細は、ログインスペクタのヘルプを参照してください。

    メールがエラーなく送信された場合、絞り込まれたログビューには次のメッセージが表示されます。

    DEBUG|メッセージは正常に送信されました。

静的メソッドをコールする

ここでは、クラスの sendMail() メソッドはクラスメンバー変数にアクセスしないため、インスタンスメソッドである必要はありません。宣言に static キーワードを追加して、静的メソッドに変更しましょう。静的メソッドは、クラスのインスタンスでコールされる必要がなく、クラス名で直接コールできるため、インスタンスメソッドよりもコールが容易です。

  1. 開発者コンソールで、開いている EmailManager クラスのタブを見つけ、sendMail() メソッド定義の最初の行を次のように変更します (変更は static キーワードの追加のみ)。
    public static void sendMail(String address, String subject, String body) {
  2. Ctrl キーを押しながら S キーを押してクラスを保存します。
  3. [Execute Anonymous (匿名実行)] ウィンドウで、クラス名で静的メソッドをコールするようにステートメントを変更します。
    EmailManager.sendMail('Your email address', 'Trailhead Tutorial', '123 body');
    
  4. [Execute (実行)] をクリックします。

    このメソッドが実行されたので、前の手順と同様に、メールと必要に応じてデバッグログをチェックできます。

retargeting