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');
}
}
|
abstract
で protected
なメソッドは 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
がついていないメソッドは上書きできない
abstract
で virtual
なメソッドは定義できない
「このメソッドは将来的にoverrideするかもしれない」と予測するのは難しいので、
基本的につけない、必要な時期が来たら付与する、くらいで良いのではないかと。
override
かどうか
override
がつけることで継承元のメソッドを上書きできるoverride
をつけないでメソッドを上書きすることはできないoverride
できるのは継承元で virtual
がついているメソッド- Java の
@Override
とは違うので abstract
なメソッドの実装につけることはできない
static
かどうか
static
がついているメソッドはインスタンス化しなくても呼び出すことができる- Java のそれと同じ