Groovy:ステロイドをオンにします

更新:この投稿は、2016年11月17日に大幅な更新が行われ、誤ったステートメントと例が修正され、基になるHTMLレイアウトが修正され(WebブラウザーでHTMLソースを表示しない限り、読者にはわかりません)、いくつかのスペルの問題が修正されました。何らかの理由で古い誤った投稿を見たい場合は、WaybackMachineによってアーカイブされたバージョンを確認してください。

私は以前、GroovyがStringをオンにするためのサポートについてブログを書きました。Groovyは、単なるリテラルString(およびJavaでオンにできるリテラル整数型)以上のものをオンに切り替えることができます。ここでは、これを簡単に説明します。

Groovyのswitchステートメントは、「isCase」という名前で実装されたメソッドを使用して、特定のswitchオプションが一致するかどうかを判別します。これは、カスタムオブジェクトがGroovyで「切り替え可能」であることを意味します。このブログ投稿の簡単な例では、JavaクラスSimpleStateとを使用しますState.java

リスト1.SimpleState.java

 package dustin.examples; import static java.lang.System.out; /** * Java class to be used in demonstrating the "switch on steroids" in Groovy. * The Groovy script will be able to {@code switch} on instances of this class * via the implicit invocation of {@code toString()} if the {@code case} * statements use {@code String}s as the items to match. */ public class SimpleState { private String stateName; public SimpleState(final String newStateName) { this.stateName = newStateName; } @Override public String toString() { return this.stateName; } } 

上記のJavaクラスのString表現は、次のコードリストに示すようにGroovyスクリプトでオンに切り替えることができますswitchOnSimpleState.groovy

リスト2.switchOnSimpleState.groovy

#!/usr/bin/env groovy import dustin.examples.SimpleState SimpleState state = new SimpleState("Colorado") print "The motto for the state of ${state.stateName} is '" switch (state) { case "Alabama": print "Audemus jura nostra defendere" break case "Alaska": print "North to the future" break case "Arizona": print "Ditat Deus" break case "Arkansas": print "Regnat populus" break case "California": print "Eureka" break case "Colorado": print "Nil sine numine" break case "Connecticut": print "Qui transtulit sustinet" break default : print "<>" } println "'" 

上記のGroovyスクリプトを上記の単純なJavaクラスに対して実行すると、GroovyがtoString()オンになっている「状態」インスタンスでメソッドを暗黙的に呼び出すため、コードは正しい情報を出力しますState。 Javaでも同様の機能を実現できtoString()ますが、スイッチをオンにするオブジェクトを明示的に呼び出す必要があります。 2010年の初めにこの投稿の元のバージョンを書いたとき、Javaは文字列のスイッチオンをサポートしていなかったことも覚えておく価値があります。上記を実行した結果を以下の画面スナップショットに示します(これは、修正および更新される前のこの元の投稿からの古い画面スナップショットであるため、スクリプトの名前は上記と一致しません)。

GroovyとこのisCase方法を使用すると、好きなデータ型のほぼすべてをオンに切り替えることができます。これを示すために、JavaクラスStateを使用し、そのコードリストを以下に示します。これには、のisCase(State)インスタンスStateが切り替えられるときにGroovyが暗黙的に呼び出すメソッドが含まれていますcase。この場合、isCase(State)メソッドは単にState.equals(Object)メソッドを呼び出して、それcaseが真であるかどうかを判別します。これはの実装の典型的な動作ですがisCase(Object)、私たちが望む方法でそれが当てはまるかどうかを判断させることができたはずです。

リスト3.State.java

package dustin.examples; import static java.lang.System.out; public class State { private String stateName; public State(final String newStateName) { this.stateName = newStateName; } /** * Method to be used by Groovy's switch implicitly when an instance of this * class is switched on. * * @param compareState State passed via case to me to be compared to me. */ public boolean isCase(final State compareState) { return compareState != null ? compareState.equals(this) : false; } public boolean equals(final Object other) { if (!(other instanceof State)) { return false; } final State otherState = (State) other; if (this.stateName == null ? otherState.stateName != null : !this.stateName.equals(otherState.stateName)) { return false; } return true; } @Override public String toString() { return this.stateName; } } 

上に示した単純な標準JavaクラスisCaseは、Groovyがスイッチをオンにできるようにするメソッドを実装しています。次のGroovyスクリプトはこのクラスを使用しており、のインスタンスを正常にオンに切り替えることができますState

#!/usr/bin/env groovy import dustin.examples.State State state = new State("Arkansas") State alabama = new State("Alabama") State arkansas = new State("Arkansas") State alaska = new State("Alaska") State arizona = new State("Arizona") State california = new State("California") State colorado = new State("Colorado") State connecticut = new State("Connecticut") print "The motto for the state of ${state.stateName} is '" switch (state) { case alabama : print "Audemus jura nostra defendere" break case alaska : print "North to the future" break case arizona : print "Ditat Deus" break case arkansas : print "Regnat populus" break case california : print "Eureka" break case colorado : print "Nil sine numine" break case connecticut : print "Qui transtulit sustinet" break default : print "<>" } println "'" 

次の画面のスナップショットの出力は、GroovyスクリプトがStateオブジェクトのインスタンスを正常にオンにできることを示しています。最初のコマンドは前述の「単純な」例を使用しており、2番目のコマンドはStateisCase(State)メソッドを呼び出す必要がある例を使用しています。

この能力の美しさは、クラスがの実装に基づいて「切り替え」も持っているisCase()、それはそう長く必要としている可能性がある状況では、より簡潔な構文を可能とすることである方法if/ else if/else構造を。このような構成は完全に回避することが望ましいですが、場合switchによってはそれらに遭遇し、Groovyステートメントによって面倒が少なくなります。

Groovyswitchを使用すると、指定した条件に一致する複数のスイッチオプションを使用できます。したがって、case最初の一致が実行されるため、一致が優先される順序でステートメントをリストすることが重要です。このbreakキーワードはswitch、Javaと同じようにGroovyでも使用されます。

Groovyがswitchサポートするものにははるかに多くの力があります。この力をカバーするいくつかの投稿には、Groovy Goodness:The Switch Statement、Groovy、私があなたを愛する方法を数えさせてください、そしてGroovyドキュメントが含まれます。

このストーリー「Groovy:Switch on Steroids」は、もともとJavaWorldによって公開されました。