8
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-02-10

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

API Version 49.0です。

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

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

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

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

switch on triggerStatus {
    when 1 {
        // do stuff
    }
    when 2 {
        // do stuff
    }
    when 3 {
        // do stuff
    }
    when else {
        // do stuff
    }
}

こちらはデプロイできる。
ただ、マジックナンバーとなり、可読性がよろしくない。

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

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

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

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

// 定数定義
public final String INPUT_PAGE  = 'input';
public final String LIST_PAGE   = 'list';
public final String DETAIL_PAGE = 'detail';

switchの式を定数に変更

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

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

public String inputPage  { get { return 'input';  }}
public String listPage   { get { return 'list';   }}
public String detailPage { get { return 'detail'; }}

プロパティに変更

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使用に変更。

// Enum定義
private enum TriggerPage { INPUT, LIST, DETAIL }
private TriggerPage triggerPage;
TriggerPage triggerPage = HogeClass.TriggerPage.INPUT; // 便宜上ここで代入
switch on triggerPage {
    when INPUT {
        // do stuff
    }
    when LIST {
        // do stuff
    }
    when EDIT {
        // do stuff
    }
    when else {
        // do stuff
    }
}

デプロイできた。

TriggerPage triggerPage = HogeClass.TriggerPage.INPUT;

Enumの値を格納するときは、クラス名から指定しないといけない。

when INPUT {

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

Javaでは?

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

image.png

できた。
ちなみにstaticをつけないと怒られる。なぜ。
image.png

じゃあstaticをつけてみる

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

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を使用しろと。
なぜ定数弾かれるのだろうか。。。どなたか知ってる方コメントお待ちしてます。

8
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?