enumを使用してJavaでスイッチ(String)が見つからないという問題を解決する

Flexでプログラミングしている私の良き同僚が、Ext GWTが使用されていたプロジェクトに移ったことがありました。 時々、「Javaでこれを行う方法」と「なぜこれがないのか、どうやって回避するのか」という質問に答えなければなりませんでした。 私の同僚が書くことに慣れていたActionScriptは、Javaに比べて柔軟性が高く、変数の型のキャストと記述についてはあまり気にしませんでした。 switch構造体でString型の変数を比較することが不可能だったとき、彼は驚きました。 このようなスイッチが便利な場合(渡されたString変数の内容に応じて異なるスクリプトを処理する場合)、多くの技術的な状況があるように見えますが。



幸いなことに、この機能は現在Java 7で実装されています。しかし、ほとんどのプロジェクトでJava 7への移行がすぐには完了しないため、デザインのかさばりを避けるために自分の「美的」方法を喜んで共有したいと思います。 .then..else。



「RequestOne」、「RequestTwo」、「RequestThree」という値を取ることができる型変数があり、これに応じて異なるスクリプトが実行されるとします。



最も単純な場合、要求を処理するメソッドのコードは次のようになります。



public void processRequest(String type) { if (type.equals("RequestOne")) { scenarioOne(); } else if (type.equals("RequestTwo")) { scenarioTwo(); } else if (type.equals("RequestThree")) { scenarioThree(); } }
      
      







タイプが長い行を受け入れる場合、または1つのスクリプトに対してタイプ値の複数のバリアントがある場合、コードは読み取りに不便かもしれません。 この場合、列挙型が役に立ちます:enum。 列挙型RequestTypeを次のように説明します。



 public enum RequestType { SCENARIO_ONE("RequestOne"), SCENARIO_TWO("RequestTwo"), SCENARIO_THREE("RequestThree"); private String typeValue; private RequestType(String type) { typeValue = type; } static public RequestType getType(String pType) { for (RequestType type: RequestType.values()) { if (type.getTypeValue().equals(pType)) { return type; } } throw new RuntimeException("unknown type"); } public String getTypeValue() { return typeValue; } }
      
      







そして、processRequest(String)メソッドは次のように変換されます。



 public void processRequest(String type) { RequestType request = RequestType.getType(type); switch(request) { case SCENARIO_ONE: scenarioOne(); break; case SCENARIO_TWO: scenarioTwo(); break; case SCENARIO_THREE: scenarioThree(); break; } }
      
      







もちろん、列挙されたRequestType型の静的なgetTypeメソッドは、特に多数の可能な型値に関しては最適ではありません。 しかし、このアプローチでは、タイプの文字列値のリストを1か所に保存することができ、スイッチの構築は簡潔に見えます。 したがって、新しい型の値を追加して古い値を編集すると、桁違いに速くなり、労働生産性が向上します。



結局のところ、これはパフォーマンスの点で最良のソリューションではありませんが、上記のケースで列挙型を使用する非常に良い例です。



All Articles