Groovy
[Wikipedia|▼Menu]
.mw-parser-output .hatnote{margin:0.5em 0;padding:3px 2em;background-color:transparent;border-bottom:1px solid #a2a9b1;font-size:90%}

この項目では、プログラミング言語について説明しています。広瀬香美のシングルについては「Groovy!」をご覧ください。

プログラミング言語>>他のプログラミング言語

カテゴリ / テンプレート

GroovyGroovyのロゴ
パラダイムオブジェクト指向スクリプト言語
登場時期2003年 (2003)
設計者Java Community Process
開発者Guillaume Laforge (プロジェクトマネージャー 兼 JSR-241 リーダー)
最新リリース3.0.8/ 2021年4月16日 (3年前) (2021-04-16)[1]
型付け強い動的型付け
規格 ⇒JSR 241
プラットフォームJavaプラットフォーム
ライセンスApache License v2.0
ウェブサイトThe Groovy programming language
拡張子groovy
テンプレートを表示

Groovy(グルービー)は、Javaプラットフォーム上で動作する動的プログラミング言語である。

Groovy の処理系はオープンソースソフトウェアであり、James Strachan と Bob McWhirter らを中心に、オープンソース開発サイトであるコードハウス上で、2003年8月27日に開発が開始された(CVSへの最初のコミットがなされた)。その後、開発の主体は Guillaume Laforge と Jeremy Rayner らに移り開発が続けられている。2015年3月31日までは Pivotal がスポンサー企業となり、開発者をフルタイム雇用していたが、3月末を以て終了し、Apacheソフトウェア財団の管理に移行した[2]
概要

GroovyはJVM上で動作する言語処理系および言語の名称であり、Javaとの直接的な連携を特徴とする。例えばGroovyからすべてのJava SE APIや、Javaで書かれた任意のサードパーティ製のコンパイル済みのライブラリなどを呼び出すことができる。言語の記述能力としては、Javaで記述できることは、無名内部クラスの定義など一部の例外を除き基本的にGroovyでも記述することができる。逆に言うとJavaで記述できない機能は記述できないが、Javaと同様にC言語などで書かれたネイティブメソッドなどは呼び出すことができる。

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種の中では最速。


メソッド呼び出しの括弧は省略できる。

行末のセミコロンは省略できる。

リストマップの初期化を記述する組み込み構文を持つ。

演算子のオーバーロード定義(ユーザ定義演算子)が可能である。

組み込み型としてリストやマップを扱うことができ、それらのリテラル表記や、それらを処理する演算子が定義されている。

BigDecimal、BigInteger型などについては四則演算がオーバーロード定義されている。


検査例外をthrowsするメソッドを呼び出す際にもtry/catchで囲んだり呼び出し側メソッドをthrows宣言する必要はない。

プリミティブ型はリファレンス型と同様に扱うことができる(明示的な変換を行う必要はない)。

if文やwhile文、3項演算子('??:?')の条件節では0やnullの値は偽として扱われる(boolean型の値である必要がない)。

J2SEの正規表現クラスを扱うための組み込みの演算子(=~や==~など)が用意されている。また構文上も特別扱いされておりPerlやRubyと似た使用ができる。

文字列定数中に任意のGroovyの式を埋め込むことができる(${}の記法を用いる。GStringと呼ぶ。なお変数名の場合は中括弧も不要であり、"$変数名"の形式で変数の値を文字列に埋め込むことができる。)。

名前つき引数でのメソッド呼び出し。

アクセス修飾子のデフォルトはpublicである。

java.lang、java.io、java.math、java.net、java.util、groovy.lang、groovy.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, case

switch/case文は任意の型に対して分岐することができるように拡張されている。switch (value) {case "Hello": println "value == 'Hello'" breakcase String: println "valueはString型" breakcase 1..12: println "valueは1?12の間" breakdefault: println "それ以外"}
for

通常の for と for in がある。for を使うと、break や continue が使える。@CompileStatic を付けた状態では、C言語スタイルの for ループかつループ変数に型を付けた状態が最速であり、Java言語と同等の速度で動く。each や times はクロージャ呼び出し分の時間がかかる。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 Worldfoo

と出力される。
ExpandoMetaClassdef obj = "foo"obj.metaClass.greet = { println "Hello World" }obj.greet()
Expando

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

未実装のメソッドをuseブロック内で起動すると、ブロックで指定したクラスのクラスメソッドに処理をディスパッチする。import groovy.inspect.Inspectoruse (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" }}


次ページ
記事の検索
おまかせリスト
▼オプションを表示
ブックマーク登録
mixiチェック!
Twitterに投稿
オプション/リンク一覧
話題のニュース
列車運行情報
暇つぶしWikipedia

Size:30 KB
出典: フリー百科事典『ウィキペディア(Wikipedia)
担当:undef