tyoshikawa1106のブログ

- Force.com Developer Blog -

SFDC:オブジェクト指向 - JavaとApexの構文の違い

Javaの本を読んでいるときにオブジェクト指向の話とそのサンプルコードがでてきたので、JavaとApexで書き方が変わる部分のサンプルに使わせてもらいました。

オブジェクト指向サンプルの仕様

クラス構成
  • Employee (従業員情報クラス)
  • PartTime (アルバイト情報クラス・Employeeクラスを継承して利用するサブクラス)
  • Company (実行クラス)

Javaで書く場合

Javaで書く場合はこんな感じです。extendsでEmployeeクラスを継承したり、サブクラス側で同じメソッド名を宣言してオーバーライドしたり、superでEmployeeクラスのメソッドを呼び出したりしています。

f:id:tyoshikawa1106:20160905135134p:plain

Apexで書く場合

続いてApexで書く場合です。コードは次のようになります。Javaと書き方は異なりますが、extends、オーバーライド、superが利用できます。(詳細はコードの後にまとめています。)

f:id:tyoshikawa1106:20160905141339p:plain

JavaとApexの違い

ApexはJavaライクな言語ですが、Javaとは作法が異なる箇所がいくつかあります。

継承を許可する場合

Javaの場合、サブクラスへの継承を制御するには、finalを宣言することで継承不可のクラスとして扱うことができると思います。

package jp.co.bbreak.sokusen._1._8._3;

public final class Employee {
    // 略
}

f:id:tyoshikawa1106:20160905135724p:plain


Apexの場合は通常継承不可のクラスとして扱われ、virtualを宣言することで継承可能になる仕組みとなっています。

public virtual with sharing class Employee {
    // 略
}

サブクラスのオーバーライドメソッド

Javaではサブクラス側で継承元のメソッド名と同じ名前のメソッドを用意すれば、メソッドを上書きすることができます。Apexの場合はオーバーライドしたいときは継承元のクラスのメソッドにvirtualを宣言することで始めて上書きが許可されます。

Employee.cls
// 仕事メソッド
public virtual void work() {
    System.debug(this.position + 'です。仕事します。');
}


またサブクラス側のメソッドに対してもoverrideを宣言することで上書きが可能になります。

PartTime.cls
// 社員クラスのメソッドをオーバーライド
public override void work() {
    System.debug(getPosition() + 'です。シフトの間、仕事します。');
}

superで親クラスのメソッド呼び出し

これはApexでも同じように宣言して利用できます。

PartTime.cls
// 社員クラスのメソッドを呼び出す
public void empWork() {
    super.work();
}

Apex クラス定義について

詳細は開発者ガイドにまとめられています。


virtualのような定義修飾子ですが、他にはabstractというものも存在します。これは抽象メソッド (署名のみが宣言され、本文が定義されていないメソッド) が含まれることを宣言するためのものです。
f:id:tyoshikawa1106:20160905141216p:plain

その他の違い

コンストラクタやDebugの書き方など細かいところはいろいろ違いますが、開発者ガイドやTrailheadで開発方法を学べると思います。