【SalesForce, Apex】Switchで定数を使いたいがどうやらできない為、Enumを使用する

Switchのステートメントの式に定数を使用できなかった。

API Version 49.0です。

リファレンスを参照すると式に使用することができる型はこちらとなっている。

> Apex switch ステートメントの式では、次のいずれかの型になります。
Integer
Long
sObject
String
Enum

# リテラルを使用したSwitch　※デプロイOK

```apex
Integer triggerStatus = 1; // 便宜上ここで代入

switch on triggerStatus {
    when 1 {
        // do stuff
    }
    when 2 {
        // do stuff
    }
    when 3 {
        // do stuff
    }
    when else {
        // do stuff
    }
}
```
こちらはデプロイできる。
ただ、マジックナンバーとなり、可読性がよろしくない。


```apex
String triggerPage = 'input'; // 便宜上ここで代入

switch on triggerPage {
    when 'input' {
        // do stuff
    }
    when 'list' {
        // do stuff
    }
    when 'detail' {
        // do stuff
    }
    when else {
        // do stuff
    }
}
```

こちらもデプロイできる。
ただ、ハードコーディングになり、保守性がよろしくない。


# 定数を使用したSwitch　※デプロイNG

```apex
// 定数定義
public final String INPUT_PAGE  = 'input';
public final String LIST_PAGE   = 'list';
public final String DETAIL_PAGE = 'detail';
```
switchの式を定数に変更

```apex
String triggerPage = 'input'; // 便宜上ここで代入

switch on triggerPage {
    when INPUT_PAGE {
        // do stuff
    }
    when LIST_PAGE {
        // do stuff
    }
    when DETAIL_PAGE {
        // do stuff
    }
    when else {
        // do stuff
    }
}
```
デプロイエラー

> Variable does not exist: INPUT_PAGE (10:10)
Variable does not exist: LIST_PAGE (13:10)
null occurs as more than one when branch for this switch statement (9:1)
null occurs as more than one when branch for this switch statement (9:1)
Variable does not exist: DETAIL_PAGE (16:10)    


定数の存在を知らないようだ。なぜ。


# プロパティを使用したSwitch  ※デプロイNG

定数はダメなのでプロパティに変更して使用してみる。

```apex
public String inputPage  { get { return 'input';  }}
public String listPage   { get { return 'list';   }}
public String detailPage { get { return 'detail'; }}
```
プロパティに変更

```apex
String triggerPage = 'input';

switch on triggerPage {
    when inputPage {
        // do stuff
    }
    when listPage {
        // do stuff
    }
    when detailPage {
        // do stuff
    }
    when else {
        // do stuff
    }
}
```

デプロイエラー

> Variable does not exist: INPUT_PAGE (10:10)
Variable does not exist: LIST_PAGE (13:10)
null occurs as more than one when branch for this switch statement (9:1)
null occurs as more than one when branch for this switch statement (9:1)
Variable does not exist: DETAIL_PAGE (16:10)    


同じエラー。なぜ。

# Enumを使用したSwitch　　※デプロイOK

Enum使用に変更。

```apex
// Enum定義
private enum TriggerPage { INPUT, LIST, DETAIL }
private TriggerPage triggerPage;
```

```apex
TriggerPage triggerPage = HogeClass.TriggerPage.INPUT; // 便宜上ここで代入
switch on triggerPage {
    when INPUT {
        // do stuff
    }
    when LIST {
        // do stuff
    }
    when EDIT {
        // do stuff
    }
    when else {
        // do stuff
    }
}
```

デプロイできた。

```apex
TriggerPage triggerPage = HogeClass.TriggerPage.INPUT;
```
Enumの値を格納するときは、クラス名から指定しないといけない。

```apex
when INPUT {
```
式ではTriggerPage.INPUTとしなくても switch on で渡す値の型を見ている為、Enumで指定した値のみで大丈夫みたい。



# Javaでは？
Javaライクな言語なので、Javaではどうだろう？


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190685/abc05daa-c4f7-1f33-be33-cc3d2c833835.png)

できた。
ちなみにstaticをつけないと怒られる。なぜ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190685/5de6e6f6-5dd6-f4be-05d7-8c1fa0c368bc.png)


## じゃあstaticをつけてみる

じゃやApexの方でStaticをつけてみよう

```apex
private static final String INPUT_PAGE  = 'input';

public void switchTest() {
    switch on 'input' {
        when INPUT_PAGE {
            System.debug('aaaa');
        }
    }
}
```
デプロイエラー
> Field must be an enum reference (20:18)

Enumを使用しろと。
なぜ定数弾かれるのだろうか。。。どなたか知ってる方コメントお待ちしてます。