IF/THEN/ELSEIF/ELSEのこの基本構造の代わりに
int month = 8;
String monthString;
if (month == 1) {
monthString = "January";
} else if (month == 2) {
monthString = "February";
}
... // and so on
あるといいですね
int month = 8;
String monthString;
switch (month) {
case 1: monthString = "January";
break;
case 2: monthString = "February";
break;
..... // and so on
case 12: monthString = "December";
break;
default: monthString = "Invalid month";
break;
}
これにより、意図が明確になるため、読みやすさが向上し、デバッグが容易になります。
2018-うん!!!! -最後に-素晴らしいニュース- Switch Nowがサポートされている場合 ビデオの正確な時間にスキップ ゴールデンモーメントのセッションのYouTube
2014-残念ながら現時点ではできません。 2009年からずっとこの機能を待っていましたが、以下のコミュニティからのリンクで強く要望されています。
monthMap = new Map<Integer,String>();
monthMap.put(1,'JAN');
monthMap.put(2,'FEB');
monthMap.put(3,'MAR');
monthMap.put(4,'APR');
monthMap.put(5,'MAY');
monthMap.put(6,'JUN');
monthMap.put(7,'JUL');
monthMap.put(8,'AUG');
monthMap.put(9,'SEP');
monthMap.put(10,'OCT');
monthMap.put(11,'NOV');
monthMap.put(12,'DEC');
次に、整数の月の値に従ってgetを実行します。
大きなif-elseを書く必要はありません。
switch
ステートメントのサポートは、Summer '18リリースでApexに導入されます。
TrailheadX 2018セッションから Apexで切り替える :
最初はEnum、String、Integer、およびLongをサポートします
他の回答にコメントを追加しました。
これは実際には質問に答えませんが、私はそれをここに投げ入れるのは良い考えだとまだ思います。こんな「手作りのデートライブラリー」は見たくない...
DateTime someDate = System.now();
System.debug(someDate.format('MMM')); // Jan, Feb etc.
System.debug(someDate.format('MMMM')); // January, February etc.
現在のユーザーの言語設定が異なる場合でも、常に英語で表示されます。書式設定文字列は内部Javaメソッドに渡されるため、簡単に見てください http://docs.Oracle.com/javase/6/docs/api/Java/text/ SimpleDateFormat.html
一方、SFDCはネイティブエンジンを提供しています。回避策として、小さなユーティリティ「フレームワーク」をスイッチケースのオブジェクト指向「ステートメント」として使用できます。
使用例:
public with sharing class SwitchCaseExample {
public String result {get; set;}
public static final String MSG_FROM_ACTION_1 = 'invoke action 1';
public static final String MSG_FROM_ACTION_2 = 'invoke action 2';
public static final String MSG_FROM_ACTION_3 = 'invoke action 3';
public static final String MSG_FROM_ACTION_4 = 'invoke action 4';
public void testSwitchCase(String value) {
SwitchCaseHelper sch = new SwitchCaseHelper();
sch.switch(value)
.case('value1', new Action1(this), SwitchCaseHelper.PUT_BREAK)
.case('value2', new Action2(this), SwitchCaseHelper.PUT_CONTINUE)
.case('value3', new Action3(this), SwitchCaseHelper.PUT_BREAK)
.default(new Action4(this));
}
private class Action1 implements ActionContainer {
private SwitchCaseExample outerCtx;
public Action1(SwitchCaseExample outerCtx) {
this.outerCtx = outerCtx;
}
public String doAction() {
outerCtx.result = MSG_FROM_ACTION_1;
return null;
}
}
private class Action2 implements ActionContainer {
private SwitchCaseExample outerCtx;
public Action2(SwitchCaseExample outerCtx) {
this.outerCtx = outerCtx;
}
public String doAction() {
outerCtx.result = MSG_FROM_ACTION_2;
return null;
}
}
private class Action3 implements ActionContainer {
private SwitchCaseExample outerCtx;
public Action3(SwitchCaseExample outerCtx) {
this.outerCtx = outerCtx;
}
public String doAction() {
outerCtx.result = MSG_FROM_ACTION_3;
return null;
}
}
private class Action4 implements ActionContainer {
private SwitchCaseExample outerCtx;
public Action4(SwitchCaseExample outerCtx) {
this.outerCtx = outerCtx;
}
public String doAction() {
outerCtx.result = MSG_FROM_ACTION_4;
return null;
}
}
}
インターフェース:
public interface ActionContainer {
String doAction();
}
そして、スイッチケースのロジック実装
public with sharing class SwitchCaseHelper {
public static final Boolean PUT_BREAK = true;
public static final Boolean PUT_CONTINUE = false;
public class SwitchCaseException extends Exception {}
public static final String EXCEPTION_MESSAGE = 'Switch-Case construction must have one (and only one) "switch" statement';
@TestVisible
private Object switchOperand;
@TestVisible
private Boolean isCaseAfterBreakStatement;
@TestVisible
private Boolean isPreviousSwitch;
public SwitchCaseHelper() {
isCaseAfterBreakStatement = false;
}
public SwitchCaseHelper switch(Object switchOperand) {
if (isPreviousSwitch != null) {
throw new SwitchCaseException(EXCEPTION_MESSAGE);
}
isPreviousSwitch = true;
this.switchOperand = switchOperand;
return this;
}
public SwitchCaseHelper case(Object caseOperand, ActionContainer container, Boolean hasBreak) {
if (isPreviousSwitch == null) {
throw new SwitchCaseException(EXCEPTION_MESSAGE);
}
if (isPreviousSwitch) {
isPreviousSwitch = false;
}
if (isCaseAfterBreakStatement) {
return this;
}
if (switchOperand.equals(caseOperand)) {
container.doAction();
isCaseAfterBreakStatement = hasBreak;
}
return this;
}
public SwitchCaseHelper default(ActionContainer container) {
if (isPreviousSwitch == null) {
throw new SwitchCaseException(EXCEPTION_MESSAGE);
}
if (!isCaseAfterBreakStatement) {
container.doAction();
}
return this;
}
}
ApexがSwitchステートメントをサポートするようになりました(Summer '18リリースから):
ここで完全な回答: https://success.salesforce.com/answers?id=90630000000wkANAAY
via リリースノート:
場所:この変更は、Enterprise、Performance、Unlimited、およびDeveloperエディションのLightning ExperienceおよびSalesforce Classicに適用されます。
方法:構文は次のとおりです。
switch on expression {
when value1 { // when block 1
// code block 1
}
when value2 { // when block 2
// code block 2
}
when value3 { // when block 3
// code block 3
}
when else { // when else block, optional
// code block 4
}
}
PS:将来の参照のためにここに追加します。