(Translated by https://www.hiragana.jp/)
「Groovy」の版間の差分 - Wikipedia コンテンツにスキップ

「Groovy」のはんあいだ差分さぶん

出典しゅってん: フリー百科ひゃっか事典じてん『ウィキペディア(Wikipedia)』
削除さくじょされた内容ないよう 追加ついかされた内容ないよう
Jun(会話かいわ | 投稿とうこう記録きろく)
最新さいしんばん更新こうしん出典しゅってん追加ついか
 
(82にん利用りようしゃによる、あいだの223はん表示ひょうじ)
1ぎょう: 1ぎょう:
{{otheruses|プログラミング言語げんご|広瀬ひろせ香美こうみのシングル|Groovy!}}
'''Groovy'''('''グルービー''')は、[[JVM]](Java Virtual Machine)じょう動作どうさするスクリプト言語げんごである。
{{プログラミング言語げんご}}
{{Infobox プログラミング言語げんご
| name = Groovy
| logo = [[ファイル:Groovy-logo.svg|200px]]
| caption =
| file ext = groovy
| paradigm = [[オブジェクト指向しこう]]、[[スクリプト言語げんご]]
| released = {{Start date|2003}}
| designer = [[Java Community Process]]
| developer = Guillaume Laforge(プロジェクトマネージャー けん JSR-241 リーダー)
| latest release version = 4.0.21
| latest release date = {{start date and age|2024|04|06}}<ref>{{Cite web|url=https://github.com/apache/groovy/tags|title=Tags · apache/groovy · GitHub|accessdate=2024-06-23}}</ref><ref>[https://groovy.apache.org/download.html The Apache Groovy programming language - Download]</ref>
| latest preview version =
| latest preview date = <!-- {{start date and age|YYYY|MM|DD}} -->
| typing = つよい[[動的どうてき型付かたつけ]]
| implementations =
| dialects =
| 規格きかく = [http://jcp.org/en/jsr/detail?id=241 JSR 241]
| influenced by = [[Java]]、[[Ruby]]、[[Python]]、[[Dylan]]、[[Smalltalk]]
| influenced =
| programming language =
| operating system = [[Javaプラットフォーム]]
| license = [[Apache License]] v2.0
| website = [https://groovy-lang.org/ The Apache Groovy programming language]
| wikibooks =
}}
{{lang|en|'''Groovy'''}}(グルービー)は、[[Javaプラットフォーム]]じょう動作どうさする[[動的どうてきプログラミング言語げんご]]である。


{{lang|en|Groovy}} の処理しょりけいは[[オープンソース]]ソフトウェアであり、{{lang|en|James Strachan}} と {{lang|en|Bob McWhirter}} らを中心ちゅうしんに、オープンソース開発かいはつサイトであるコードハウスじょうで、2003ねん8がつ27にち開発かいはつ開始かいしされた([[Concurrent Versions System|CVS]]への最初さいしょのコミットがなされた)。その開発かいはつ主体しゅたいは {{lang|en|Guillaume Laforge}} と {{lang|en|Jeremy Rayner}} らにうつ開発かいはつつづけられている。[[2015ねん]][[3がつ31にち]]までは Pivotal がスポンサー企業きぎょうとなり、開発かいはつしゃをフルタイム雇用こようしていたが、3がつまつをもって終了しゅうりょうし、[[Apacheソフトウェア財団ざいだん]]の管理かんり移行いこうした<ref>[http://glaforge.appspot.com/article/groovy-projects-intends-to-join-the-apache-software-foundation Groovy Projects intends to join the Apache Software Foundation -- Guillaume Laforge's Blog]</ref>。
Groovyの処理しょりけいは[[オープンソース]]ソフトウェアであり、James Starachanらを中心ちゅうしんに、
オープンソース開発かいはつサイトである[http://groovy.codehaus.org/ codehaus]じょうでBSD/Apacheライクなライセンスにて開発かいはつ公開こうかいされている。
Groovyは2003ねん8がつ27にち開発かいはつ開始かいしされた(CVSへの最初さいしょのコミットがなされた)。


==機能きのう特徴とくちょう==
== 概要がいよう ==
Groovyは[[Java仮想かそうマシン]] (JVM) じょう動作どうさする言語げんご処理しょりけいおよび言語げんご名称めいしょうであり、[[Java]]との直接的ちょくせつてき連携れんけい特徴とくちょうとする。たとえばGroovyからすべての[[Java Platform, Standard Edition|Java SE]] [[アプリケーションプログラミングインタフェース|API]]や、Javaでかれた任意にんいのサードパーティせいのコンパイルみのライブラリなどをすことができる。言語げんご記述きじゅつ能力のうりょくとしては、Javaで記述きじゅつできることは、無名むめい内部ないぶクラスの定義ていぎなど一部いちぶ例外れいがいのぞ基本きほんてきにGroovyでも記述きじゅつすることができる。ぎゃくうとJavaで記述きじゅつできない機能きのう記述きじゅつできないが、Javaと同様どうように[[C言語げんご]]などでかれたネイティブメソッドなどは[[Java Native Interface|JNI]]経由けいゆすことができる。


Groovyは動的どうてき言語げんごであり、直接ちょくせつスクリプトを実行じっこうすることができる。Groovyコード断片だんぺんをコマンドラインにあたえ[[ワンライナー]]として実行じっこうすることも可能かのうである。なおこのとき中間ちゅうかんてきにJavaソースコードが生成せいせいされることはなく、[[バイトコード]]がメモリじょう生成せいせいされて直接ちょくせつ実行じっこうされる。また、groovycコマンド(groovyコンパイラ)を使つかってクラスファイルをあらかじめ生成せいせいしておくこともできる。いずれにせよGroovyコードは内部ないぶてきには[[Javaバイトコード]]に変換へんかんされてJVMじょう実行じっこうされる。
GroovyはJVMじょう動作どうさする言語げんご処理しょりけいおよび言語げんご名称めいしょうであり、[[Java]]との直接的ちょくせつてき連携れんけい特徴とくちょうとする。
たとえばGroovyからすべての[[J2SE]] APIや、Javaでかれた任意にんいのサードパーティせいのコンパイルみのライブラリなどをすことができる。
言語げんご記述きじゅつ能力のうりょくとしては、Javaで記述きじゅつできることは、
(無名むめい内部ないぶクラスの定義ていぎなど一部いちぶ例外れいがいのぞき)基本きほんてきにGroovyでも記述きじゅつすることができる
(ぎゃくうとJavaで記述きじゅつできない機能きのう記述きじゅつできないがJavaと同様どうように[[C言語げんご]]などでかれたネイティブメソッドなどはすことができる)。


このとき、GroovyコードもJavaコードも、JVMからみると両方りょうほうともJavaバイトコードとして解釈かいしゃく実行じっこうされるという意味いみ区別くべつがない。Groovyのこのような仕組しくみから、GroovyはJavaときわめて親和しんわせいたかく、Java技術ぎじゅつつちかわれてきた開発かいはつインフラやライブラリ、ノウハウ、ツール、JVM最適さいてき技術ぎじゅつなどのおおくをそのまま流用りゅうようすることができる。Groovyから生成せいせいしたクラスファイルは通常つうじょうのクラスファイルであるので、[[Javaクラスファイル]]を要求ようきゅうするプラグインなどをGroovyで記述きじゅつすることも容易よういである。
Groovyは動的どうてき言語げんごであり、直接ちょくせつスクリプトを実行じっこうすることができる。Groovyコード断片だんぺんをコマンドラインにあたえ[[ワンライナー]]として実行じっこうすることも可能かのうである。
なおこのとき中間ちゅうかんてきにJavaソースコードが生成せいせいされることはなく、
[[バイトコード]]がメモリじょう生成せいせいされて直接ちょくせつ実行じっこうされる。
また、groovycコマンド(groovyコンパイラ)を使つかってクラスファイルをあらかじめ生成せいせいしておくこともできる。
いずれにせよGroovyコードは内部ないぶてきにはJavaバイトコードに変換へんかんされてJVMじょう実行じっこうされる。

このとき、GroovyコードもJavaコードも、JVMからみると両方りょうほうともJavaバイトコードとして解釈かいしゃく実行じっこうされるという意味いみ区別くべつがない。Groovyのこのような仕組しくみから、GroovyはJavaときわめて親和しんわせいたかく、
Java技術ぎじゅつでつち使つかわれてきた開発かいはつインフラやライブラリ、ノウハウ、ツール、
JVM最適さいてき技術ぎじゅつなどのおおくをそのまま流用りゅうようすることができる。
Groovyから生成せいせいしたクラスファイルは通常つうじょうのクラスファイルであるので、
Javaクラスファイルを要求ようきゅうするプラグインなどをGroovyで記述きじゅつすることも容易よういである。


Groovyは、おな実行じっこうシステムを共有きょうゆうする、Javaコードのべつ表記ひょうきほうだとかんがえることもできる。
Groovyは、おな実行じっこうシステムを共有きょうゆうする、Javaコードのべつ表記ひょうきほうだとかんがえることもできる。


==言語げんご仕様しよう==
== 言語げんご仕様しよう ==
Groovyの言語げんご仕様しようはJavaのそれをベースとしており、基本きほんてきにJavaプログラマにとってしたしみやすいものである。Groovyはスクリプト言語げんごとして大幅おおはば簡易かんいされた記述きじゅつゆるしている。以下いか簡略かんりゃく記述きじゅつ可能かのうとするGroovy言語げんご特徴とくちょうしめす。

* 変数へんすうかた宣言せんげん不要ふようである。
Groovyの言語げんご仕様しようはJavaのそれをベースとしており、基本きほんてきにJavaプログラマにとってしたしみやすいものである。
** 通常つうじょう場合ばあい - 宣言せんげんをしなかった場合ばあい{{Javadoc:SE|java/lang|Object}}がたとしてあつかわれ、メソッドしは[[動的どうてきディスパッチ]]によって解決かいけつされる(変数へんすうかた宣言せんげんをすることも可能かのうであり、静的せいてきなスタイルと動的どうてきなスタイルの場合ばあいおうじた使つかけることができる)。メソッドの引数ひきすうがえかた宣言せんげん同様どうようである。
Groovyはスクリプト言語げんごとして大幅おおはば簡易かんいされた記述きじゅつゆるしている。以下いか簡略かんりゃく記述きじゅつ可能かのうとするGroovy言語げんご特徴とくちょうしめす。
** <code>@TypeChecked</code> を使用しようした場合ばあい - 変数へんすうかた指定していしなかった場合ばあいは[[かた推論すいろん]]され、かたただしいかどうかチェックされる。メソッドしは動的どうてきディスパッチのまま。
* Groovyコードはクラス定義ていぎちゅうにある必要ひつようはなく、クラス定義ていぎ外側そとがわでのメソッドの定義ていぎじつ行文こうぶん記述きじゅつ可能かのうである。
* 変数へんすうかた宣言せんげん不要ふようである。宣言せんげんをしなかっ場合ばあいObjectがたとしあつかわれ、メソッドしはすべて[[どうてきディスパッチ]]よって解決かいけつされる変数へんすうかた宣言せんげんをすることも可能かのうであり、静的せいてきスタイルと動的どうてきなスタイルの場合ばあいおうじた使つかいることがきる)
** <code>@CompileStatic</code> 使用しようした場合ばあい - 上記じょうきくわて、メソッドしはせいてき解決かいけつされる。<code>@ToString</code> ようコンパイルときメソッド生成せいせい通常つうじょうどお使つかいの3しゅなか最速さいそく
* メソッドしの括弧かっこ省略しょうりゃくできる。
* メソッドしの括弧かっこ省略しょうりゃくできる。
* 行末ゆくすえのセミコロンは省略しょうりゃくできる。
* 行末ゆくすえのセミコロンは省略しょうりゃくできる。
* リストやマップの初期しょき記述きじゅつする構文こうぶんつ。
* [[リスト (抽象ちゅうしょうデータがた)|リスト]][[連想れんそう配列はいれつ|マップ]]初期しょき記述きじゅつする構文こうぶんつ。
* 演算えんざんのオーバーロード定義ていぎ(ユーザ定義ていぎ演算えんざん)可能かのうである。
* 演算えんざんのオーバーロード定義ていぎユーザ定義ていぎ演算えんざん可能かのうである。
** リストやマップをあつか演算えんざん定義ていぎされている。
** がたとしてリストやマップをあつかことができ、それらのリテラル表記ひょうきや、それらを処理しょりする演算えんざん定義ていぎされている。
** BigDecimal、BigIntegerがたなどについては四則しそく演算えんざんがオーバーロード定義ていぎされている。
** {{Javadoc:SE|java/math|BigDecimal}}{{Javadoc:SE|java/math|BigInteger}}かたなどについては四則しそく演算えんざんがオーバーロード定義ていぎされている。
* 検査けんさ例外れいがいthrowsするメソッドをさいにもtry/catchでかこんだりがわメソッドをthrows宣言せんげんする必要ひつようはない。
* 検査けんさ例外れいがいが<code>throws</code>宣言せんげんされたメソッドをさいにも、<code>try</code>-<code>catch</code>かこんだりがわメソッドを<code>throws</code>宣言せんげんしたりする必要ひつようはない。
* プリミティブがたリファレンスかた同様どうようあつかうことができる(明示めいじてき変換へんかんおこな必要ひつようはない)
* プリミティブがた参照さんしょうかた同様どうようあつかうことができる明示めいじてき変換へんかんおこな必要ひつようはない
* [[ifぶん]]や[[whileぶん]]、[[条件じょうけん演算えんざん|さんこう演算えんざん]](<code>c?x:y</code>)の条件じょうけんぶしでは0やnullのにせとしてあつかわれる({{code|boolean|groovy}}がたである必要ひつようがない)。
* switch/caseぶん任意にんいかたたいして分岐ぶんきすることができるように拡張かくちょうされている。
* J2SEの正規せいき表現ひょうげんクラスをあつかうためのみの演算えんざん(<code>=~</code>や<code>==~</code>など)が用意よういされている。また構文こうぶんじょう特別とくべつあつかいされておりPerlやRubyと使用しようができる。
* for(i in ..)形式けいしきのforぶん(J2SE 5.0("Tiger")のそれと同様どうよう)。
* 文字もじれつ定数ていすうちゅう任意にんいのGroovyのしきむことができる。<code>${}</code>の記法きほうもちいる。これをGStringとぶ。なお変数へんすうめい場合ばあいちゅう括弧かっこ不要ふようであり、<code>"$変数へんすうめい"</code>の形式けいしき変数へんすう文字もじれつむことができる。
* J2SEの正規せいき表現ひょうげんクラスをあつかうためのみの演算えんざん(=~や==~など)が用意よういされている。また構文こうぶんじょう特別とくべつあつかいされておりPerlやRubyと使用しようができる。
* 文字もじれつ定数ていすうちゅう任意にんいのGroovyのしきむことができる(${}の記法きほうもちいる。GStringとぶ)。
* Getter、Setterメソッドの自動じどう生成せいせい
* フィールドアクセスの記法きほうでGetter、Setterメソッドをすことができる。
* デフォルト引数ひきすう(メソッド・コンストラクタしチェインの自動じどう生成せいせい)。
* 名前なまえつき引数ひきすうでのメソッドし。
* 名前なまえつき引数ひきすうでのメソッドし。
* アクセス修飾しゅうしょくのデフォルトは{{code|public|groovy}}である。
* {{Javadoc:SE|package=java.lang|java/lang}}、{{Javadoc:SE|package=java.io|java/io}}、{{Javadoc:SE|package=java.math|java/math}}、{{Javadoc:SE|package=java.net|java/net}}、{{Javadoc:SE|package=java.util|java/util}}、<code>groovy.lang</code>、<code>groovy.util</code>は明示めいじてき指定していしなくても、暗黙あんもくてきにインポートされている。
* groovyファイルで定義ていぎしたクラスは<code>GroovyObject</code>[[インタフェース (抽象ちゅうしょうがた)|インタフェース]]を暗黙あんもくてき実装じっそうし、クラスのそと定義ていぎしたフィールドやメソッドは<code>Script</code>[[抽象ちゅうしょうクラス]]の実装じっそうクラスのフィールドやメソッドとして定義ていぎされたとなされる。

=== クラス定義ていぎ ===

Groovyコードはクラス定義ていぎちゅうにある必要ひつようはなく、クラス定義ていぎ外側そとがわ(トップレベル)でのメソッドの定義ていぎじつ行文こうぶん記述きじゅつ可能かのうである。

以下いか、ファイルめいが HelloTest.groovy であるとする。
<syntaxhighlight lang="groovy">
println "Hello, World!"
</syntaxhighlight>
記述きじゅつすると、下記かきおな意味いみつ。
<syntaxhighlight lang="groovy">
class HelloTest {
public HelloTest() {
println "Hello, World!"
}
public static void main(String[] args) {
new HelloTest()
}
}
</syntaxhighlight>

=== switchぶん ===

[[switchぶん]]は任意にんいかたたいして分岐ぶんきすることができるように拡張かくちょうされている(かたスイッチ)<ref>[https://groovy-lang.org/semantics.html#_switch_case The Apache Groovy programming language - Semantics - §switch / case]</ref>。
<syntaxhighlight lang="groovy">
switch (value) {
case "Hello":
println "value == 'Hello'"
break
case String:
println "valueはStringがた"
break
case 1..12:
println "valueは1から12のあいだ"
break
default:
println "それ以外いがい"
}
</syntaxhighlight>

=== forループ ===

通常つうじょうの [[forぶん|for]] と [[foreachぶん|for in]] がある。いずれも[[breakぶん]]や[[continueぶん]]が使つかえる。<code>@CompileStatic</code> をけた状態じょうたいでは、C言語げんごスタイルの for ループかつループ変数へんすうかたけた状態じょうたい最速さいそくであり、Java言語げんご同等どうとう速度そくどうごく。<code>each</code> や <code>times</code> はクロージャぶん時間じかんがかかる。
<syntaxhighlight lang="groovy">
for (int i = 0; i < 3; i++) { println "$i: Hello" }
for (i in 1..3) { println "$i: Hello" }
(1..3).each { println "$it: Hello" }
3.times { println "$it: Hello" }
</syntaxhighlight>

=== Getter, Setter ===

Getter、Setterメソッドは自動じどう生成せいせいされる。フィールドアクセスの記法きほうでGetter、Setterメソッドをすことができる。
<syntaxhighlight lang="groovy">
class Pojo {
def name
}
def pojo = new Pojo(name:"名前なまえ")
println pojo.getName() // getName()が生成せいせいされている
println pojo.name // getName()がばれる
</syntaxhighlight>

=== デフォルト引数ひきすう ===

デフォルト引数ひきすう(メソッド・コンストラクタしチェインの自動じどう生成せいせい)。

<syntaxhighlight lang="groovy">
def greet(mess = "Hello World") {
println mess
}
greet()
greet("foo")
</syntaxhighlight>
Hello World
foo
出力しゅつりょくされる。

=== ExpandoMetaClass ===

<syntaxhighlight lang="groovy">
def obj = "foo"
obj.metaClass.greet = { println "Hello World" }
obj.greet()
</syntaxhighlight>

=== Expando ===

Groovyは実装じっそうのフィールドの参照さんしょう代入だいにゅう実装じっそうのメソッドの起動きどうをキャッチしGroovyObjectのメソッドを起動きどうする。
<syntaxhighlight lang="groovy">
GroovyObject#getProperty(String name)
GroovyObject#setProperty(String name, Object value)
GroovyObject#invokeMethod(String name, Object arguments)
</syntaxhighlight>
以下いか、Expando を使用しようしたれいである。
<syntaxhighlight lang="groovy">
def obj = new Expando()
obj.greetingMessage = "Hello World"
obj.greet = { println greetingMessage }
obj.greet()
obj.message = "foo"
println obj.message
</syntaxhighlight>
また、連想れんそう配列はいれつ使用しようしても、構文こうぶん可能かのうである。<code>this</code>の意味いみわる。
<syntaxhighlight lang="groovy">
def obj = [:]
obj.greetingMessage = "Hello World"
obj.greet = { println obj.greetingMessage }
obj.greet()
obj.message = "foo"
println obj.message
</syntaxhighlight>

=== MOP (Meta Object Protocol) ===

<syntaxhighlight lang="groovy">
GroovyObject#setMetaClass(MetaClass)
</syntaxhighlight>
<syntaxhighlight lang="groovy">
class Main {
static void main(String[] array) {
GroovyObject groovyObject = new Main()
Interceptor interceptor = new GreetingInterceptor()
InterceptorUtils.setInterceptor(groovyObject, interceptor)
groovyObject.greet()
}
}

class InterceptorUtils {
static void setInterceptor(GroovyObject groovyObject, Interceptor interceptor) {
ProxyMetaClass proxyMetaClass = ProxyMetaClass.getInstance(groovyObject.getClass())
proxyMetaClass.setInterceptor(interceptor)
groovyObject.setMetaClass(proxyMetaClass)
}
}

class InterceptorImpl implements Interceptor {
Object beforeInvoke(Object groovyExtensionObject, String name, Object[] arguments) {
return null
}
Object afterInvoke(Object groovyExtensionObject, String name, Object[] arguments, Object beforeInvokeReturnObject) {
Object object = invokeMethod(name, arguments)
return object
}
boolean doInvoke() {
return false
}
}

class GreetingInterceptor extends InterceptorImpl {
void greet() {
println "Hello World"
}
}
</syntaxhighlight>

=== use ===

実装じっそうのメソッドを<code>use</code>ブロックない起動きどうすると、ブロックで指定していしたクラスのクラスメソッドに処理しょりをディスパッチする。

<syntaxhighlight lang="groovy">
import groovy.inspect.Inspector

use (Category.class) {
def obj = "Hoge"
println obj.getShortClassName()
println obj.toString()
}

// 名前なまえ自由じゆう
class Category {
// 最初さいしょ引数ひきすうは、メソッドが起動きどうされたインスタンスの参照さんしょうコピー。
static getShortClassName(obj) {
Inspector.shortName(obj.getClass())
}
// 実装じっそうメソッドと重複じゅうふくする場合ばあい、Groovyはカテゴリーより実装じっそうメソッドを優先ゆうせん
static String toString(Object obj) {
"Hello World"
}
}
</syntaxhighlight>

String
Hoge
出力しゅつりょくされる。

=== GroovyMarkup ===
Groovyコードの表記ひょうき使つかい、Groovyの機能きのう(クロージャやダイナミックなメソッド追加ついか)を駆使くししてツリーデータ構造こうぞうげをおこなう。具体ぐたいてきには、新規しんきノードの追加ついかをメソッドしとして、その新規しんきノードのノードぐん記述きじゅつをメソッドにわたすクロージャとして定義ていぎする。そのクロージャにはさらにそのノードのための一連いちれんのノード追加ついかメソッドしをふくめることができ…… というように再帰さいきてき記述きじゅつしていく。このときGroovyのループぶんやifぶんなどの制御せいぎょ構造こうぞうふくむすべてのGroovyの言語げんご機能きのう使つかうことができる。

GroovyMarkupは直感ちょっかんてきには、[[Extensible Markup Language|XML]]ほど静的せいてきではないが、純粋じゅんすいなプログラムコードれつよりは宣言せんげんてきな、「やや宣言せんげんてきなデータ記述きじゅつ」であるといえるかもしれない。

GroovyMarkupは基本きほんてき機能きのうであり、GroovyMarkupを使つかった具体ぐたいてきなライブラリとしては、[[Swing]]の[[グラフィカルユーザインタフェース|GUI]]コンポーネントのてをおこなうSwingBuilder、DOMのようなXMLデータ構造こうぞうてるMarkupBuilderなどがある。

<syntaxhighlight lang="groovy">
import groovy.xml.MarkupBuilder

class Main {

static void main(array) {

Writer writer = new StringWriter()

writer.println("<?xml version='1.0' ?>")
writer.println()

def builder = new MarkupBuilder(writer)

/*
名前なまえがルートのタグめいであるメソッド

引数ひきすうがマップである場合ばあいはタグの属性ぞくせい
引数ひきすう文字もじれつである場合ばあいはテキストノードの内容ないようでHTMLエスケープされます。

実装じっそうメソッドをハンドルするGroovyObject#invokeMethod(String methodName, Object methodParameter)を利用りよう

メソッドの括弧かっこ省略しょうりゃくされています。
*/
builder.html(xmlns:"http://www.w3.org/1999/xhtml", "xml:lang":"ja") { //以降いこう名前なまえがタグめいであるクロージャ

/*
引数ひきすうがクロージャである場合ばあい名前なまえがタグめい
引数ひきすうがマップである場合ばあいはタグの属性ぞくせい
引数ひきすう文字もじれつである場合ばあいはテキストノードの内容ないようでHTMLエスケープされます。
*/

head() {
}

body() {

div("1ぎょう");
div("2ぎょう");

//ヒア・ドキュメント構文こうぶん

String string = """
<div id='3'>3ぎょう</div>
<div id='4'>4ぎょう</div>
"""

pre(string) {
}
}
}

println writer.toString()

/*
標準ひょうじゅん出力しゅつりょく結果けっか
<?xml version='1.0' ?>

<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='ja'>
<head />
<body>
<div>1ぎょう</div>
<div>2ぎょう</div>
<pre>
&lt;div id='3'&gt;3ぎょう&lt;/div&gt;
&lt;div id='4'&gt;4ぎょう&lt;/div&gt;
</pre>
</body>
</html>
*/
}
}
</syntaxhighlight>

=== クロージャ ===
Groovyでは[[コードブロック]]をファーストクラス(だいいちきゅう)オブジェクトとして生成せいせいし、変数へんすう格納かくのうしたりメソッド引数ひきすうもどとしてわたししたりすることができる。Groovyのライブラリはかえ処理しょり入出力にゅうしゅつりょく処理しょりなどを中心ちゅうしんに[[クロージャ]]が駆使くしされており、簡潔かんけつ表記ひょうきおこなうことができる。

クロージャは構築こうちくされたスコープない変数へんすうきできる。
<syntaxhighlight lang="groovy">
def str = "Hello World"
def readerClosure = { println str }
readerClosure()
def writerClosure = { str = "foo" }
writerClosure()
println str
</syntaxhighlight>
このコードを実行じっこうすると
Hello World
foo
出力しゅつりょくされる。

=== Groovy JDK ===
GroovyからJava SEの標準ひょうじゅんAPIをすべてすことができるが、このさいにGroovyから使つかうと便利べんりなメソッドが[[リフレクション (情報じょうほう工学こうがく)|リフレクション]]をもちいてJava SEクラスに擬似ぎじてき多数たすう追加ついかされている。たとえば、クロージャをとる<code>File.eachLine()</code>といったメソッドを使用しようすることができ、以下いかよう記述きじゅつ可能かのうとなっている。
<syntaxhighlight lang="groovy">
new File("test.txt").eachLine { println it }
</syntaxhighlight>
<code>File.eachLine(Closure)</code>はそれぞれのくだり変数へんすう<code>it</code>に代入だいにゅうしてクロージャをす、というかえ処理しょりおこなうだけでなく、処理しょり終了しゅうりょうもしくは例外れいがい発生はっせいに、ファイルのクローズ処理しょりおこなう。つまりJavaの場合ばあい必要ひつような<code>finally</code>ふしにおける{{Javadoc:SE|name=java.io.FileInputStream|java/io|FileInputStream}}や{{Javadoc:SE|name=java.io.FileOutputStream|java/io|FileOutputStream}}の<code>close()</code>処理しょり必要ひつようとせず簡潔かんけつ記述きじゅつできる。ほかにも同様どうように、<code>Reader.eachLine(Closure)</code>メソッドなども追加ついかされている。また、<code>File.getText(String characterCodeSetName)</code>、<code>Reader.getText()</code>、<code>Reader.readLines()</code>というファイルのすべての内容ないよう一括いっかつむメソッドが追加ついかされており、入出力にゅうしゅつりょく処理しょり簡潔かんけつ記述きじゅつすることができる。

== 言語げんごからの影響えいきょう ==
{{よう出典しゅってん範囲はんい|date=2024-06|James StrachanはGroovyはオブジェクト指向しこうスクリプト言語げんご[[Ruby]]からおおきな影響えいきょうけていることをなん公言こうげんしている}}。実際じっさい、クロージャの仕様しよう表記ひょうき、その予約よやく選択せんたくなどにおいてRubyからの影響えいきょう色濃いろこることができる。その、[[Python]]、[[Dylan]]、[[Smalltalk]]などからも言語げんご機能きのうまれている。

== 適用てきよう分野ぶんや ==
Groovyは本格ほんかくてきなアプリケーション構築こうちくにも使つかえるし、また、Javaシステム開発かいはつにおけるテストコードの記述きじゅつげることにも使つかえる。Groovyには標準ひょうじゅんで[[JUnit]]機能きのうまれている。さらに、スクリプト言語げんごとして、フィルタてきなツールやプロトタイプをくだすことも容易よういである。


アプリケーションの複雑ふくざつ設定せってい(configuration)やカスタマイズよう言語げんごとしてもちいるということも注目ちゅうもくされている。[[Apache Ant|Ant]]の設定せっていファイル (build.xml) をGroovyで記述きじゅつする機能きのう標準ひょうじゅんまれているし、いくつかの[[DIコンテナ]](依存いぞんせい注入ちゅうにゅうコンテナ、[[IoCコンテナ]])とばれる[[アプリケーションフレームワーク]]における起動きどう設定せっていファイルの記述きじゅつ言語げんごとして採用さいようされるなど、XMLの代用だいようとして採用さいようされはじめている。ビルド自動じどうシステムの[[Gradle]]でも同様どうようにGroovyが使つかわれている(こちらは[[Kotlin]] DSLも使つかえるようになっている)。
==特徴とくちょうてき言語げんご機能きのう==
Groovyの特徴とくちょうてき言語げんご機能きのうのいくつかを以下いかしめす。
===GroovyMarkup===
Groovyコードの表記ひょうき使つかってツリーデータ構造こうぞうげをおこなう。
具体ぐたいてきには、クロージャやダイナミックなメソッド追加ついか機能きのうもちいて、
新規しんきノードの追加ついかをメソッドしとして、
その新規しんきノードがノードぐんをクロージャとして記述きじゅつする。


{{独自どくじ研究けんきゅう範囲はんい|date=2024-06|将来しょうらいてきには、既存きそんJavaシステムを連携れんけいさせるグルー言語げんごとして、[[Microsoft Windows]]の世界せかいにおける[[Microsoft Visual Basic|Visual Basic]]や[[Visual Basic for Applications|VBA]]の役割やくわりをJavaシステム全般ぜんぱんにおいてたせる可能かのうせいがある。}}<!-- VB/VBAは用途ようと全然ぜんぜんちがうだろ……一応いちおうVBScriptもあるが、deprecatedになっていて将来しょうらいせいはない。VB.NETも言語げんごとしての発展はってんまっている。PowerShellもあるが、汎用はんようせいてんではおとる。C#やF#は汎用はんようスクリプト言語げんごとしての活用かつよう模索もさくされている(csx/fsx)。 -->
GroovyMarkupは基本きほんてき機能きのうであり、GroovyMarkupを使つかった具体ぐたいてき
ライブラリとしては、SwingのGUIコンポーネントのてをおこなうSwingBuilder、
DOMのようなXMLデータ構造こうぞうてるMarkupBuilderなどがある。


Groovyの応用おうようとして注目ちゅうもくすべき事例じれいとして、[[Grails]]をあげることができる。[[Grails]]はGroovyを使用しようしたWebアプリケーションフレームワークであり、Webアプリ開発かいはつにおいて[[Ruby on Rails]]が実現じつげんしているようなたか生産せいさんせいをもたらす。
===クロージャ===
Groovyではコードブロックをいちきゅう市民しみんオブジェクトとして生成せいせいし、
変数へんすう格納かくのうしたりメソッド引数ひきすうもどとしてわたししたりすることができる。
Groovyのライブラリはかえ処理しょり入出力にゅうしゅつりょく処理しょりなどを中心ちゅうしんにクロージャが駆使くしされており、
簡潔かんけつ表記ひょうきおこなうことができる。


===Groovy JDK===
== 標準ひょうじゅん ==
Groovyは[[2004ねん]][[3がつ29にち]]にJava技術ぎじゅつ標準ひょうじゅんプロセスJCPにおいてJSR 241として受理じゅりされ仕様しよう標準ひょうじゅんがすすめられたが、その dormant (休止きゅうし) あつかいとなった<ref>[http://jcp.org/en/jsr/detail?id=241 JSR 241: The Groovy Programming Language]</ref>。
GroovyからJ2SEの標準ひょうじゅんAPIをすべてすことができるが、
このさいにGroovyから使つかうと便利べんりなメソッドが[[リフレクション]]をもちいてJ2SEクラスに擬似ぎじてき多数たすう追加ついかされている。たとえば、クロージャをとるFile.eachLine()といったメソッドを使用しようすることができ、
以下いかよう記述きじゅつ可能かのうとなっている。


== サンプルコード ==
new java.io.File("test.txt").eachLine{
=== クロージャとループ ===
println it
<syntaxhighlight lang="groovy">
}
def forLoop() {
def map = [name: "James", location: "London"]
for(e in map) { println "entry $e.key is $e.value" }
}
def closureExample(list) {
list.each { println "value $it" }
}
def values = [1, 2, 3, "abc"]
closureExample(values)
forLoop()
</syntaxhighlight>


=== メモちょう ===
==言語げんごからの影響えいきょう==
<syntaxhighlight lang="groovy">
import groovy.swing.SwingBuilder
import javax.swing.*


def notepad
James StrachanはGroovyはオブジェクト指向しこうスクリプト言語げんご[[Ruby]]からおおきな影響えいきょうけていることをなん公言こうげんしている。
new SwingBuilder().frame(title: "メモちょう", defaultCloseOperation: JFrame.EXIT_ON_CLOSE,
実際じっさい、クロージャの仕様しよう表記ひょうき、その予約よやく選択せんたくなどにおいてRubyからの影響えいきょう色濃いろこることができる。
size: [800, 600], show: true, locationRelativeTo: null) {
その、Python、Dylan、Smalltalkなどからも言語げんご機能きのうまれている。
menuBar() {
menu(text: "ファイル(F)", mnemonic: 'F') {
menuItem(text: "名前なまえをつけて保存ほぞん(A)...", mnemonic: 'A', actionPerformed: {
fc = new JFileChooser()
if (fc.showSaveDialog(null) == JFileChooser.APPROVE_OPTION) {
fc.selectedFile.text = notepad.text
}
})
menuItem(text: "終了しゅうりょう(X)", mnemonic: 'X', actionPerformed: { System.exit(0) })
}
}
scrollPane() { notepad = textArea() }
}
</syntaxhighlight>


== 統合とうごう開発かいはつ環境かんきょう ==
==適用てきよう分野ぶんや==
おおくの[[統合とうごう開発かいはつ環境かんきょう]](IDE)がGroovyに対応たいおうしている。


=== NetBeans ===
Groovは開発かいはつちゅう言語げんごでありバグや問題もんだいてんすくなくないが、
[[NetBeans]]は標準ひょうじゅんでGroovyをサポートしている。
現状げんじょう有用ゆうよう用途ようととしては、
Javaシステム開発かいはつにおけるテストコードの記述きじゅつげることができる(Groovyには標準ひょうじゅんでJUnit機能きのうまれている)。もちろんスクリプト言語げんごとして、フィルタてきなツールをやプロトタイプをくだすことも容易よういである。


* 構文こうぶん強調きょうちょう表示ひょうじ、コードたたみ、およびコード補完ほかんをサポート。
アプリケーションの複雑ふくざつなコンフィグレーションやカスタマイズよう
言語げんごとしてもちいるということも注目ちゅうもくされている。Antの設定せっていファイル(build.xml)をGroobyで記述きじゅつする
機能きのう標準ひょうじゅんまれているし、いくつかの[[DIコンテナ]](依存いぞんせい注入ちゅうにゅうコンテナ、[[IoCコンテナ]])
ばれるアプリケーションフレームワークにおける起動きどう設定せっていファイル
記述きじゅつ言語げんごとして採用さいようされるなど、XMLの代用だいようとして採用さいようされはじめている。


=== Eclipse ===
将来しょうらいてきには、既存きそんJavaシステムを連携れんけいさせるグルー言語げんごとして、
[[Eclipse (統合とうごう開発かいはつ環境かんきょう)|Eclipse]]はプラグインにてGroovyをサポートしている<ref>[https://marketplace.eclipse.org/content/groovy-development-tools Groovy Development Tools | Eclipse Plugins, Bundles and Products - Eclipse Marketplace | Eclipse Foundation]</ref>。
Windowsの世界せかいにおけるVBやVBAの役割やくわりをJavaシステム全般ぜんぱんにおいてたせる可能かのうせいがある。
* 変数へんすうかた指定していしたものは、メソッドの補完ほかん可能かのう
* リファクタリング。メソッドの抽出ちゅうしゅつ名前なまえ変更へんこうなど。
* デバッガ
* ソースコードの整形せいけい


=== IntelliJ IDEA ===
==標準ひょうじゅん==
[[IntelliJ IDEA]] では Groovy や Grails や Gant などが標準ひょうじゅんでサポートされている<ref>[http://www.jetbrains.com/idea/features/groovy_grails.html IntelliJ IDEA :: Smart Groovy IDE with Groovy-Java compiler for Groovy scripts, Groovy Swingbuilder, Groovy server pages with ER diagram for productive Groovy programming, plus Groovy on Grails, available via Groovy plugin]</ref>。
* 補完ほかんができる。
** JavaとGroovyが相互そうご補完ほかんができ、JavaのクラスをGroovyで補完ほかんできるだけでなく、リアルタイムでGroovyのクラスをJavaで補完ほかん可能かのう。JavaとGroovyをプロジェクトない混在こんざいさせることができる。
* Ctrl + クリックによる、定義ていぎした場所ばしょへの移動いどう
** 補完ほかん同様どうよう、JavaとGroovy相互そうご移動いどう可能かのう
* Dynamic properties により、動的どうてき追加ついかされるメンバ変数へんすう管理かんりすることができる。これにより、動的どうてき追加ついかされるメンバ変数へんすうたいしても補完ほかんやスペルミスのチェックが可能かのうになる。
* デバッガ
* コーディングじょうのエラーにたいして、リアルタイムで表示ひょうじし、Quick-fix ができる。
* GroovyDoc にたいしても補完ほかん使つかえる。
* 名前なまえ変更へんこうやメソッドの抽出ちゅうしゅつ変数へんすう導入どうにゅうなどのリファクタリング機能きのうがある。
** Groovyでの名前なまえ変更へんこうは、同時どうじにJavaのソースコードにたいしても修正しゅうせい(リファクタリング)がかかる。
* Grails や Groovy Server Pages (GSP) をサポートしている。
* Gant や Apache Ivy をサポートしていて、Gant にたいして補完ほかんやデバッガによるデバッグができる。
* [[Gradle]] を Gradle GUI Plugin でサポート。


==参照さんしょう==
Groovyは2004ねん3がつ29にちにJava技術ぎじゅつ標準ひょうじゅんプロセスJCPにおいて[http://jcp.org/en/jsr/detail?id=241 JSR 294]として受理じゅりされ仕様しよう標準ひょうじゅんがすすめられている。このことによってcodehausによる実装じっそう以外いがい実装じっそうてくる可能かのうせいまれている。また各社かくしゃ製品せいひんベンダによってサポートがすすめられていくことが期待きたいされる。
<references />


== 関連かんれん項目こうもく ==
==サンプルコード==
* [[Grails]]
以下いかにGroovyのサンプルコードをしめす。
* [[Gradle]]
* [[Java]]
* [[Kotlin]]
* [[Scala]]
* [[Ceylon]]


== 外部がいぶリンク ==
println "hello world"
*[http://groovy-lang.org/ Groovyホームページ] {{En icon}}
[1,2,3,4,5].each {println "${it * 2}"}
*[http://groovy-lang.org/documentation.html Groovy - Documentation] {{En icon}}
map = ["taro":1, "jiro":2]
**[http://groovy-lang.org/gdk.html Groovy JDK]
map["taro"] = 3
**[http://groovy-lang.org/api.html Groovy API]
println map["taro"]
*[http://jcp.org/en/jsr/detail?id=241 JSR 241] {{En icon}}
* [http://pleac.sourceforge.net/pleac_groovy/index.html PLEAC-Groovy] {{En icon}}
* [https://koji-k.github.io/groovy-tutorial/ Apache Groovy日本語にほんごチュートリアル]


{{Java}}
*[http://groovy.codehaus.org/ Groovyホームページ]
{{Normdaten}}
*[http://jcp.org/en/jsr/detail?id=241 JSR 241]
[[Category:スクリプト言語げんご|Groovy]]
*[http://xpc.aa0.netvolante.jp/groovylab/space/start Groovyラボ]
[[Category:Java specification requests|Groovy]]
[[Category:オブジェクト指向しこう言語げんご|Groovy]]
[[Category:Java仮想かそうマシンで動作どうさするプログラミング言語げんご]]

2024ねん6がつ23にち (日)にち 00:35時点じてんにおける最新さいしんばん

Groovy
Groovyのロゴ
パラダイム オブジェクト指向しこうスクリプト言語げんご
登場とうじょう時期じき 2003ねん (2003)
設計せっけいしゃ Java Community Process
開発かいはつしゃ Guillaume Laforge(プロジェクトマネージャー けん JSR-241 リーダー)
最新さいしんリリース 4.0.21/ 2024ねん4がつ6にち (4かげつまえ) (2024-04-06)[1][2]
型付かたつ つよ動的どうてき型付かたつ
規格きかく JSR 241
影響えいきょうけた言語げんご JavaRubyPythonDylanSmalltalk
プラットフォーム Javaプラットフォーム
ライセンス Apache License v2.0
ウェブサイト The Apache Groovy programming language
拡張子かくちょうし groovy
テンプレートを表示ひょうじ

Groovy(グルービー)は、Javaプラットフォームうえ動作どうさする動的どうてきプログラミング言語げんごである。

Groovy処理しょりけいオープンソースソフトウェアであり、James StrachanBob McWhirter らを中心ちゅうしんに、オープンソース開発かいはつサイトであるコードハウスじょうで、2003ねん8がつ27にち開発かいはつ開始かいしされた(CVSへの最初さいしょのコミットがなされた)。その開発かいはつ主体しゅたいGuillaume LaforgeJeremy Rayner らにうつ開発かいはつつづけられている。2015ねん3月31にちまでは Pivotal がスポンサー企業きぎょうとなり、開発かいはつしゃをフルタイム雇用こようしていたが、3がつまつをもって終了しゅうりょうし、Apacheソフトウェア財団ざいだん管理かんり移行いこうした[3]

概要がいよう

[編集へんしゅう]

GroovyはJava仮想かそうマシン (JVM) じょう動作どうさする言語げんご処理しょりけいおよび言語げんご名称めいしょうであり、Javaとの直接的ちょくせつてき連携れんけい特徴とくちょうとする。たとえばGroovyからすべてのJava SE APIや、Javaでかれた任意にんいのサードパーティせいのコンパイルみのライブラリなどをすことができる。言語げんご記述きじゅつ能力のうりょくとしては、Javaで記述きじゅつできることは、無名むめい内部ないぶクラスの定義ていぎなど一部いちぶ例外れいがいのぞ基本きほんてきにGroovyでも記述きじゅつすることができる。ぎゃくうとJavaで記述きじゅつできない機能きのう記述きじゅつできないが、Javaと同様どうようC言語げんごなどでかれたネイティブメソッドなどはJNI経由けいゆすことができる。

Groovyは動的どうてき言語げんごであり、直接ちょくせつスクリプトを実行じっこうすることができる。Groovyコード断片だんぺんをコマンドラインにあたワンライナーとして実行じっこうすることも可能かのうである。なおこのとき中間ちゅうかんてきにJavaソースコードが生成せいせいされることはなく、バイトコードがメモリじょう生成せいせいされて直接ちょくせつ実行じっこうされる。また、groovycコマンド(groovyコンパイラ)を使つかってクラスファイルをあらかじめ生成せいせいしておくこともできる。いずれにせよGroovyコードは内部ないぶてきにはJavaバイトコード変換へんかんされてJVMじょう実行じっこうされる。

このとき、GroovyコードもJavaコードも、JVMからみると両方りょうほうともJavaバイトコードとして解釈かいしゃく実行じっこうされるという意味いみ区別くべつがない。Groovyのこのような仕組しくみから、GroovyはJavaときわめて親和しんわせいたかく、Java技術ぎじゅつつちかわれてきた開発かいはつインフラやライブラリ、ノウハウ、ツール、JVM最適さいてき技術ぎじゅつなどのおおくをそのまま流用りゅうようすることができる。Groovyから生成せいせいしたクラスファイルは通常つうじょうのクラスファイルであるので、Javaクラスファイル要求ようきゅうするプラグインなどをGroovyで記述きじゅつすることも容易よういである。

Groovyは、おな実行じっこうシステムを共有きょうゆうする、Javaコードのべつ表記ひょうきほうだとかんがえることもできる。

言語げんご仕様しよう

[編集へんしゅう]

Groovyの言語げんご仕様しようはJavaのそれをベースとしており、基本きほんてきにJavaプログラマにとってしたしみやすいものである。Groovyはスクリプト言語げんごとして大幅おおはば簡易かんいされた記述きじゅつゆるしている。以下いか簡略かんりゃく記述きじゅつ可能かのうとするGroovy言語げんご特徴とくちょうしめす。

  • 変数へんすうかた宣言せんげん不要ふようである。
    • 通常つうじょう場合ばあい - 宣言せんげんをしなかった場合ばあいObjectかたとしてあつかわれ、メソッドしは動的どうてきディスパッチによって解決かいけつされる(変数へんすうかた宣言せんげんをすることも可能かのうであり、静的せいてきなスタイルと動的どうてきなスタイルの場合ばあいおうじた使つかけることができる)。メソッドの引数ひきすうがえかた宣言せんげん同様どうようである。
    • @TypeChecked使用しようした場合ばあい - 変数へんすうかた指定していしなかった場合ばあいかた推論すいろんされ、かたただしいかどうかチェックされる。メソッドしは動的どうてきディスパッチのまま。
    • @CompileStatic使用しようした場合ばあい - 上記じょうきくわえて、メソッドしは静的せいてき解決かいけつされる。@ToString のようなコンパイルのメソッド生成せいせい通常つうじょうどお使つかえる。この3しゅなかでは最速さいそく
  • メソッドしの括弧かっこ省略しょうりゃくできる。
  • 行末ゆくすえのセミコロンは省略しょうりゃくできる。
  • リストマップ初期しょき記述きじゅつする構文こうぶんつ。
  • 演算えんざんのオーバーロード定義ていぎ(ユーザ定義ていぎ演算えんざん)が可能かのうである。
    • がたとしてリストやマップをあつかうことができ、それらのリテラル表記ひょうきや、それらを処理しょりする演算えんざん定義ていぎされている。
    • BigDecimalBigIntegerかたなどについては四則しそく演算えんざんがオーバーロード定義ていぎされている。
  • 検査けんさ例外れいがいthrows宣言せんげんされたメソッドをさいにも、try-catchかこんだり、がわメソッドをthrows宣言せんげんしたりする必要ひつようはない。
  • プリミティブがた参照さんしょうがた同様どうようあつかうことができる(明示めいじてき変換へんかんおこな必要ひつようはない)。
  • ifぶんwhileぶんさんこう演算えんざんc?x:y)の条件じょうけんぶしでは0やnullのにせとしてあつかわれる(booleanかたである必要ひつようがない)。
  • J2SEの正規せいき表現ひょうげんクラスをあつかうためのみの演算えんざん=~==~など)が用意よういされている。また構文こうぶんじょう特別とくべつあつかいされておりPerlやRubyと使用しようができる。
  • 文字もじれつ定数ていすうちゅう任意にんいのGroovyのしきむことができる。${}記法きほうもちいる。これをGStringとぶ。なお変数へんすうめい場合ばあいちゅう括弧かっこ不要ふようであり、"$変数へんすうめい"形式けいしき変数へんすう文字もじれつむことができる。
  • 名前なまえつき引数ひきすうでのメソッドし。
  • アクセス修飾しゅうしょくのデフォルトはpublicである。
  • java.langjava.iojava.mathjava.netjava.utilgroovy.langgroovy.util明示めいじてき指定していしなくても、暗黙あんもくてきにインポートされている。
  • groovyファイルで定義ていぎしたクラスはGroovyObjectインタフェース暗黙あんもくてき実装じっそうし、クラスのそと定義ていぎしたフィールドやメソッドはScript抽象ちゅうしょうクラス実装じっそうクラスのフィールドやメソッドとして定義ていぎされたとなされる。

クラス定義ていぎ

[編集へんしゅう]

Groovyコードはクラス定義ていぎちゅうにある必要ひつようはなく、クラス定義ていぎ外側そとがわ(トップレベル)でのメソッドの定義ていぎじつ行文こうぶん記述きじゅつ可能かのうである。

以下いか、ファイルめいが HelloTest.groovy であるとする。

println "Hello, World!"

記述きじゅつすると、下記かきおな意味いみつ。

class HelloTest {
    public HelloTest() {
        println "Hello, World!"
    }
    public static void main(String[] args) {
        new HelloTest()
    }
}

switchぶん

[編集へんしゅう]

switchぶん任意にんいかたたいして分岐ぶんきすることができるように拡張かくちょうされている(かたスイッチ)[4]

switch (value) {
case "Hello": 
   println "value == 'Hello'"
   break
case String: 
   println "valueはStringがた"
   break
case 1..12: 
   println "valueは1から12のあいだ"
   break
default:
   println "それ以外いがい"
}

forループ

[編集へんしゅう]

通常つうじょうforfor in がある。いずれもbreakぶんcontinueぶん使つかえる。@CompileStaticけた状態じょうたいでは、C言語げんごスタイルの for ループかつループ変数へんすうかたけた状態じょうたい最速さいそくであり、Java言語げんご同等どうとう速度そくどうごく。eachtimes はクロージャぶん時間じかんがかかる。

for (int i = 0; i < 3; i++) { println "$i: Hello" }
for (i in 1..3) { println "$i: Hello" }
(1..3).each { println "$it: Hello" }
3.times { println "$it: Hello" }

Getter, Setter

[編集へんしゅう]

Getter、Setterメソッドは自動じどう生成せいせいされる。フィールドアクセスの記法きほうでGetter、Setterメソッドをすことができる。

class Pojo {
    def name
}
def pojo = new Pojo(name:"名前なまえ")
println pojo.getName() // getName()が生成せいせいされている
println pojo.name // getName()がばれる

デフォルト引数ひきすう

[編集へんしゅう]

デフォルト引数ひきすう(メソッド・コンストラクタしチェインの自動じどう生成せいせい)。

def greet(mess = "Hello World") {
    println mess
}
greet()
greet("foo")

Hello World
foo

出力しゅつりょくされる。

ExpandoMetaClass

[編集へんしゅう]
def obj = "foo"
obj.metaClass.greet = { println "Hello World" }
obj.greet()

Groovyは実装じっそうのフィールドの参照さんしょう代入だいにゅう実装じっそうのメソッドの起動きどうをキャッチしGroovyObjectのメソッドを起動きどうする。

GroovyObject#getProperty(String name)
GroovyObject#setProperty(String name, Object value)
GroovyObject#invokeMethod(String name, Object arguments)

以下いか、Expando を使用しようしたれいである。

def obj = new Expando()
obj.greetingMessage = "Hello World"
obj.greet = { println greetingMessage }
obj.greet()
obj.message = "foo"
println obj.message

また、連想れんそう配列はいれつ使用しようしても、構文こうぶん可能かのうである。this意味いみわる。

def obj = [:]
obj.greetingMessage = "Hello World"
obj.greet = { println obj.greetingMessage }
obj.greet()
obj.message = "foo"
println obj.message

MOP (Meta Object Protocol)

[編集へんしゅう]
GroovyObject#setMetaClass(MetaClass)
class Main {
  static void main(String[] array) {
    GroovyObject groovyObject = new Main()
    Interceptor interceptor = new GreetingInterceptor()
    InterceptorUtils.setInterceptor(groovyObject, interceptor)
    groovyObject.greet()
  }
}

class InterceptorUtils {
  static void setInterceptor(GroovyObject groovyObject, Interceptor interceptor) {
    ProxyMetaClass proxyMetaClass = ProxyMetaClass.getInstance(groovyObject.getClass())
    proxyMetaClass.setInterceptor(interceptor)
    groovyObject.setMetaClass(proxyMetaClass)
  }
}

class InterceptorImpl implements Interceptor {
  Object beforeInvoke(Object groovyExtensionObject, String name, Object[] arguments) {
    return null
  }
  Object afterInvoke(Object groovyExtensionObject, String name, Object[] arguments, Object beforeInvokeReturnObject) {
    Object object = invokeMethod(name, arguments)
    return object
  }
  boolean doInvoke() {
    return false
  }
}

class GreetingInterceptor extends InterceptorImpl {
  void greet() {
    println "Hello World"
  }
}

実装じっそうのメソッドをuseブロックない起動きどうすると、ブロックで指定していしたクラスのクラスメソッドに処理しょりをディスパッチする。

import groovy.inspect.Inspector

use (Category.class) {
    def obj = "Hoge"
    println obj.getShortClassName()
    println obj.toString()
}

// 名前なまえ自由じゆう
class Category {
    // 最初さいしょ引数ひきすうは、メソッドが起動きどうされたインスタンスの参照さんしょうコピー。
    static getShortClassName(obj) {
        Inspector.shortName(obj.getClass())
    }
    // 実装じっそうメソッドと重複じゅうふくする場合ばあい、Groovyはカテゴリーより実装じっそうメソッドを優先ゆうせん
    static String toString(Object obj) {
        "Hello World"
    }
}

String
Hoge

出力しゅつりょくされる。

GroovyMarkup

[編集へんしゅう]

Groovyコードの表記ひょうき使つかい、Groovyの機能きのう(クロージャやダイナミックなメソッド追加ついか)を駆使くししてツリーデータ構造こうぞうげをおこなう。具体ぐたいてきには、新規しんきノードの追加ついかをメソッドしとして、その新規しんきノードのノードぐん記述きじゅつをメソッドにわたすクロージャとして定義ていぎする。そのクロージャにはさらにそのノードのための一連いちれんのノード追加ついかメソッドしをふくめることができ…… というように再帰さいきてき記述きじゅつしていく。このときGroovyのループぶんやifぶんなどの制御せいぎょ構造こうぞうふくむすべてのGroovyの言語げんご機能きのう使つかうことができる。

GroovyMarkupは直感ちょっかんてきには、XMLほど静的せいてきではないが、純粋じゅんすいなプログラムコードれつよりは宣言せんげんてきな、「やや宣言せんげんてきなデータ記述きじゅつ」であるといえるかもしれない。

GroovyMarkupは基本きほんてき機能きのうであり、GroovyMarkupを使つかった具体ぐたいてきなライブラリとしては、SwingGUIコンポーネントのてをおこなうSwingBuilder、DOMのようなXMLデータ構造こうぞうてるMarkupBuilderなどがある。

import groovy.xml.MarkupBuilder

class Main {

  static void main(array) {

    Writer writer = new StringWriter()

    writer.println("<?xml version='1.0' ?>")
    writer.println()

    def builder = new MarkupBuilder(writer)

    /*
     名前なまえがルートのタグめいであるメソッド

      引数ひきすうがマップである場合ばあいはタグの属性ぞくせい
      引数ひきすう文字もじれつである場合ばあいはテキストノードの内容ないようでHTMLエスケープされます。

      実装じっそうメソッドをハンドルするGroovyObject#invokeMethod(String methodName, Object methodParameter)を利用りよう

      メソッドの括弧かっこ省略しょうりゃくされています。
    */
    builder.html(xmlns:"http://www.w3.org/1999/xhtml", "xml:lang":"ja") { //以降いこう名前なまえがタグめいであるクロージャ

      /*
       引数ひきすうがクロージャである場合ばあい名前なまえがタグめい
        引数ひきすうがマップである場合ばあいはタグの属性ぞくせい
        引数ひきすう文字もじれつである場合ばあいはテキストノードの内容ないようでHTMLエスケープされます。
      */

      head() {
      }

      body() {

        div("1ぎょう");
        div("2ぎょう");

        //ヒア・ドキュメント構文こうぶん

        String string = """
      <div id='3'>3ぎょう</div>
      <div id='4'>4ぎょう</div>
    """

        pre(string) {
        }
      }
    }

    println writer.toString()

    /*
      標準ひょうじゅん出力しゅつりょく結果けっか
<?xml version='1.0' ?>

<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='ja'>
  <head />
  <body>
    <div>1ぎょう</div>
    <div>2ぎょう</div>
    <pre>
      &lt;div id='3'&gt;3ぎょう&lt;/div&gt;
      &lt;div id='4'&gt;4ぎょう&lt;/div&gt;
    </pre>
  </body>
</html>
    */
  }
}

クロージャ

[編集へんしゅう]

Groovyではコードブロックをファーストクラス(だいいちきゅう)オブジェクトとして生成せいせいし、変数へんすう格納かくのうしたりメソッド引数ひきすうもどとしてわたししたりすることができる。Groovyのライブラリはかえ処理しょり入出力にゅうしゅつりょく処理しょりなどを中心ちゅうしんクロージャ駆使くしされており、簡潔かんけつ表記ひょうきおこなうことができる。

クロージャは構築こうちくされたスコープない変数へんすうきできる。

def str = "Hello World"
def readerClosure = { println str }
readerClosure()
def writerClosure = { str = "foo" }
writerClosure()
println str

このコードを実行じっこうすると

Hello World
foo

出力しゅつりょくされる。

GroovyからJava SEの標準ひょうじゅんAPIをすべてすことができるが、このさいにGroovyから使つかうと便利べんりなメソッドがリフレクションもちいてJava SEクラスに擬似ぎじてき多数たすう追加ついかされている。たとえば、クロージャをとるFile.eachLine()といったメソッドを使用しようすることができ、以下いかよう記述きじゅつ可能かのうとなっている。

new File("test.txt").eachLine { println it }

File.eachLine(Closure)はそれぞれのくだり変数へんすうit代入だいにゅうしてクロージャをす、というかえ処理しょりおこなうだけでなく、処理しょり終了しゅうりょうもしくは例外れいがい発生はっせいに、ファイルのクローズ処理しょりおこなう。つまりJavaの場合ばあい必要ひつようfinallyふしにおけるjava.io.FileInputStreamjava.io.FileOutputStreamclose()処理しょり必要ひつようとせず簡潔かんけつ記述きじゅつできる。ほかにも同様どうように、Reader.eachLine(Closure)メソッドなども追加ついかされている。また、File.getText(String characterCodeSetName)Reader.getText()Reader.readLines()というファイルのすべての内容ないよう一括いっかつむメソッドが追加ついかされており、入出力にゅうしゅつりょく処理しょり簡潔かんけつ記述きじゅつすることができる。

言語げんごからの影響えいきょう

[編集へんしゅう]

James StrachanはGroovyはオブジェクト指向しこうスクリプト言語げんごRubyからおおきな影響えいきょうけていることをなん公言こうげんしている[よう出典しゅってん]実際じっさい、クロージャの仕様しよう表記ひょうき、その予約よやく選択せんたくなどにおいてRubyからの影響えいきょう色濃いろこることができる。そのPythonDylanSmalltalkなどからも言語げんご機能きのうまれている。

適用てきよう分野ぶんや

[編集へんしゅう]

Groovyは本格ほんかくてきなアプリケーション構築こうちくにも使つかえるし、また、Javaシステム開発かいはつにおけるテストコードの記述きじゅつげることにも使つかえる。Groovyには標準ひょうじゅんJUnit機能きのうまれている。さらに、スクリプト言語げんごとして、フィルタてきなツールやプロトタイプをくだすことも容易よういである。

アプリケーションの複雑ふくざつ設定せってい(configuration)やカスタマイズよう言語げんごとしてもちいるということも注目ちゅうもくされている。Ant設定せっていファイル (build.xml) をGroovyで記述きじゅつする機能きのう標準ひょうじゅんまれているし、いくつかのDIコンテナ依存いぞんせい注入ちゅうにゅうコンテナ、IoCコンテナ)とばれるアプリケーションフレームワークにおける起動きどう設定せっていファイルの記述きじゅつ言語げんごとして採用さいようされるなど、XMLの代用だいようとして採用さいようされはじめている。ビルド自動じどうシステムのGradleでも同様どうようにGroovyが使つかわれている(こちらはKotlin DSLも使つかえるようになっている)。

将来しょうらいてきには、既存きそんJavaシステムを連携れんけいさせるグルー言語げんごとして、Microsoft Windows世界せかいにおけるVisual BasicVBA役割やくわりをJavaシステム全般ぜんぱんにおいてたせる可能かのうせいがある。[独自どくじ研究けんきゅう?]

Groovyの応用おうようとして注目ちゅうもくすべき事例じれいとして、Grailsをあげることができる。GrailsはGroovyを使用しようしたWebアプリケーションフレームワークであり、Webアプリ開発かいはつにおいてRuby on Rails実現じつげんしているようなたか生産せいさんせいをもたらす。

標準ひょうじゅん

[編集へんしゅう]

Groovyは2004ねん3月29にちにJava技術ぎじゅつ標準ひょうじゅんプロセスJCPにおいてJSR 241として受理じゅりされ仕様しよう標準ひょうじゅんがすすめられたが、その dormant (休止きゅうし) あつかいとなった[5]

サンプルコード

[編集へんしゅう]

クロージャとループ

[編集へんしゅう]
def forLoop() {
    def map = [name: "James", location: "London"]
    for(e in map) { println "entry $e.key is $e.value" }
}
def closureExample(list) {
    list.each { println "value $it" }
}
def values = [1, 2, 3, "abc"]
closureExample(values)
forLoop()

メモちょう

[編集へんしゅう]
import groovy.swing.SwingBuilder
import javax.swing.*

def notepad
new SwingBuilder().frame(title: "メモちょう", defaultCloseOperation: JFrame.EXIT_ON_CLOSE,
    size: [800, 600], show: true, locationRelativeTo: null) {
  menuBar() {
    menu(text: "ファイル(F)", mnemonic: 'F') {
      menuItem(text: "名前なまえをつけて保存ほぞん(A)...", mnemonic: 'A', actionPerformed: {
        fc = new JFileChooser()
        if (fc.showSaveDialog(null) == JFileChooser.APPROVE_OPTION) {
          fc.selectedFile.text = notepad.text
        }
      })
      menuItem(text: "終了しゅうりょう(X)", mnemonic: 'X', actionPerformed: { System.exit(0) })
    }
  }
  scrollPane() { notepad = textArea() }
}

統合とうごう開発かいはつ環境かんきょう

[編集へんしゅう]

おおくの統合とうごう開発かいはつ環境かんきょう(IDE)がGroovyに対応たいおうしている。

NetBeans標準ひょうじゅんでGroovyをサポートしている。

  • 構文こうぶん強調きょうちょう表示ひょうじ、コードたたみ、およびコード補完ほかんをサポート。

EclipseはプラグインにてGroovyをサポートしている[6]

  • 変数へんすうかた指定していしたものは、メソッドの補完ほかん可能かのう
  • リファクタリング。メソッドの抽出ちゅうしゅつ名前なまえ変更へんこうなど。
  • デバッガ
  • ソースコードの整形せいけい

IntelliJ IDEA

[編集へんしゅう]

IntelliJ IDEA では Groovy や Grails や Gant などが標準ひょうじゅんでサポートされている[7]

  • 補完ほかんができる。
    • JavaとGroovyが相互そうご補完ほかんができ、JavaのクラスをGroovyで補完ほかんできるだけでなく、リアルタイムでGroovyのクラスをJavaで補完ほかん可能かのう。JavaとGroovyをプロジェクトない混在こんざいさせることができる。
  • Ctrl + クリックによる、定義ていぎした場所ばしょへの移動いどう
    • 補完ほかん同様どうよう、JavaとGroovy相互そうご移動いどう可能かのう
  • Dynamic properties により、動的どうてき追加ついかされるメンバ変数へんすう管理かんりすることができる。これにより、動的どうてき追加ついかされるメンバ変数へんすうたいしても補完ほかんやスペルミスのチェックが可能かのうになる。
  • デバッガ
  • コーディングじょうのエラーにたいして、リアルタイムで表示ひょうじし、Quick-fix ができる。
  • GroovyDoc にたいしても補完ほかん使つかえる。
  • 名前なまえ変更へんこうやメソッドの抽出ちゅうしゅつ変数へんすう導入どうにゅうなどのリファクタリング機能きのうがある。
    • Groovyでの名前なまえ変更へんこうは、同時どうじにJavaのソースコードにたいしても修正しゅうせい(リファクタリング)がかかる。
  • Grails や Groovy Server Pages (GSP) をサポートしている。
  • Gant や Apache Ivy をサポートしていて、Gant にたいして補完ほかんやデバッガによるデバッグができる。
  • Gradle を Gradle GUI Plugin でサポート。

参照さんしょう

[編集へんしゅう]
  1. ^ Tags · apache/groovy · GitHub”. 2024ねん6がつ23にち閲覧えつらん
  2. ^ The Apache Groovy programming language - Download
  3. ^ Groovy Projects intends to join the Apache Software Foundation -- Guillaume Laforge's Blog
  4. ^ The Apache Groovy programming language - Semantics - §switch / case
  5. ^ JSR 241: The Groovy Programming Language
  6. ^ Groovy Development Tools | Eclipse Plugins, Bundles and Products - Eclipse Marketplace | Eclipse Foundation
  7. ^ IntelliJ IDEA :: Smart Groovy IDE with Groovy-Java compiler for Groovy scripts, Groovy Swingbuilder, Groovy server pages with ER diagram for productive Groovy programming, plus Groovy on Grails, available via Groovy plugin

関連かんれん項目こうもく

[編集へんしゅう]

外部がいぶリンク

[編集へんしゅう]