JavaプログラマのためのApex入門 その2

Apexの型やメソッドについてまとめました

tamuです。

Apex入門記事その2です。

前回は package, class, interface をやりました。 今回は method についてやっていきます。

method の書き方

↓ ここにすべてが書いてあります。

https://developer.salesforce.com/docs/atlas.ja-jp.238.0.apexcode.meta/apexcode/apex_classes_defining_methods.htm

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
[global | public | private | protected] /* アクセス範囲 */
[abstract] /* abstractかどうか */
[virtual] /* virtualかどうか */
[override] /* overrideかどうか */
[static] /* static かどうか */
data_type /* 型 */
method_name /* メソッド名 */
(input parameters) /* 引数 /
{
// body
}

アクセス範囲

global

  • すべての Apex クラスからアクセス可能
  • 外部から呼び出すような method に使う
  • Javaで言うところの public

public

  • 同じパッケージの Apex クラスからアクセス可能
  • フロントから呼び出すような method の場合は public にする必要がある

protected

  • 同じクラス、継承したクラスからアクセス可能
  • Javaの protected と同じだが、記述にクセがある
  • 基本的には abstract class にしか記述できない
    • 応用的に abstract class を継承した class で記述可能
1
2
3
4
5
6
public abstract class AbstractBase {
    // これはOK
    protected void foo() {
        System.debug('foo');
    }
}
1
2
3
4
5
6
public class BlahBlah {
    // これはできない
    protected void foo() {
        System.debug('blah blah blah');
    }
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
public abstract class AbstractBase {
    public void show() {
        foo();
    }

    protected virtual void foo() {
        System.debug('abstract foo');
    }
}

public class Concrete extends AbstractBase {
    // これはできる
    override protected void foo() {
        System.debug('concrete foo');
    }
}

Concrete c = new Concrete();
c.show();
-> concrete foo

private

  • 同じクラスからアクセス可能。継承したクラスからは見えない。
  • Javaの private と同じ

abstract かどうか

  • abstract class の場合、 メソッドに abstract をつけることでメソッドの皮だけ宣言することができる
  • 実装は実装クラスで行う

余談

abstract なメソッドが protected で継承先が実装クラスの(抽象クラスではない)場合、 そのまま protected でメソッドを実装しようとしてもコンパイルエラーになります。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public abstract class AbstractBase {
    public void show() {
        foo();
        bar();
    }

    abstract protected void foo();

    protected void bar() {
        System.debug('abstractbase::bar');
    }
}


public abstract class Concrete extends AbstractBase {

    // この定義だとエラーになる
    protected void foo() {
        System.debug('concrete::foo');
    }

    // これだとエラーにならない
    public void foo() {
        System.debug('concrete:foo');
    }
}

abstractprotected なメソッドは abstract class で実装することができます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
public abstract class AbstractBase {
    public void show() {
        foo();
        bar();
    }

    abstract protected void foo();

    protected void bar() {
        System.debug('abstractbase::bar');
    }
}

public abstract class AbstractAbstractBase extends AbstractBase {
    // abstract class なら protected method の定義ができる
    protected void foo() {
        System.debug('abstractabstractbase::foo');
    }
}

public class Concrete extends AbstractAbstractBase {
}

virtual かどうか

  • virtual がついているメソッドは継承先の class で上書きできる

  • 逆に virtual がついていないメソッドは上書きできない

    • Kotlin で open をつけるのに似ている
  • abstractvirtual なメソッドは定義できない

「このメソッドは将来的にoverrideするかもしれない」と予測するのは難しいので、 基本的につけない、必要な時期が来たら付与する、くらいで良いのではないかと。

override かどうか

  • override がつけることで継承元のメソッドを上書きできる
  • override をつけないでメソッドを上書きすることはできない
  • override できるのは継承元で virtual がついているメソッド
    • Java の @Override とは違うので abstract なメソッドの実装につけることはできない

static かどうか

  • static がついているメソッドはインスタンス化しなくても呼び出すことができる
  • Java のそれと同じ
Licensed under CC BY 4.0
Built with Hugo
Theme Stack designed by Jimmy