GroovyのシンタックスシュガーとDSL

序文

なぜ

純粋なGroovyプロジェクトを書き込むには、実際には接触にGroovyの最初の接触、現時点ではセミコロンは、それがJavaのだということではないではありませんが、そこに古い言語でもあり、そして学ぶために時間を投資する必要はありません見ました。テスト分野でのGroovyは場所を持っていながら、その後の研究は、より多くの、などのGradle、春の雲契約を、Groovyの図を参照するための構文は簡単ですので、あなたはすぐにテストケースを書くために得ることができ、GroovyのDSL(ドメイン固有言語)としてサポートされています、要するに、GroovyのJavaのジュニアパートナー、良いヘルパーとして見ることができます。

GroovyはJavaは、いくつかのシンタックスシュガー、より表現のコードを提供して間JVM上のオブジェクト指向プラットフォームは、静的および動的スクリプト言語、文法とほとんど差の両方をサポートしています。デフォルト小さなパートナーは、すでにJavaの基盤を持って、この記事では、JavaよりもGroovyの余分な構文糖と同様に、DSLのより多くの使用を紹介します。

シンタックスシュガー

シンタックスシュガーのいくつかの概要がDSLを見て、より快適にすることができ

  • デフキーワード変数やメソッドを定義するために使用することができ、コンパイルを行う型推論
  • 多変量作成中
def (aa, bb) = [1, 2]
  • 範囲を作成します。
int[] range = 0..10;
  • 書面でのサポート
for(variable in range) { 
   statement #1 
   statement #2 
}
  • メソッドのパラメータのデフォルト値のサポート
def someMethod(parameter1, parameter2 = 0, parameter3 = 0) { 
   // Method code goes here 
} 
  • 文字列はシェルに似たシングルと二重引用符、パイソンをサポートし、二重引用符は、変数を識別することができます

  • リストを作成

List<String> strings = ["g", "r", "o", "o", "v", "y"]
  • マップを作成します。
Map<String, String> stringMap = ["name": "wang", "age": "99"]
  • 直後に正規表現は、〜通常の声明、それが直接判断するために使用することができます
if ( "Groovy" =~ "^G")
  • キーワード属性とインタフェースのデフォルトの実装を有することができる形質を宣言するために、Java8後のインタフェースも、同じ効果を得ることができます

  • クロージャをサポートし、自分のコールを所有

def closure = { param -> println "Hello ${param}" };
closure.call("World");

10.times {num -> println num} 
  • 利便性のコーリー泥棒機能
def cl1 = {int a, b, c ->
    a + b + c
}
def cl1Curry1 = cl1.curry(1)
  • 簡単なシェルを呼び出します
println "ls -l".execute().text
  • instanceofは内と略記することができます

DSL

チェーンの呼び出し

あいまい我々はオミットはいわばコードのように、括弧メソッドを呼び出すことはできない場合には

// equivalent to: turn(left).then(right)
turn left then right

// equivalent to: take(2.pills).of(chloroquinine).after(6.hours)
take 2.pills of chloroquinine after 6.hours

// equivalent to: paint(wall).with(red, green).and(yellow)
paint wall with red, green and yellow

// with named parameters too
// equivalent to: check(that: margarita).tastes(good)
check that: margarita tastes good

// with closures as parameters
// equivalent to: given({}).when({}).then({})
given { } when { } then { }

演算子のオーバーロード

オペレーター 方法
a + b a.plus(B)
a - b a.minus(B)
a * b a.multiply(B)
a ** b a.power(B)
a / b a.div(B)
a % b a.mod(B)
a | b a.or(B)
a & b a.and(B)
a ^ b a.xor(B)
a++ 若しくは ++a a.next()
a-- 若しくは --a a.previous()
a[b] a.getAt(B)
a[b] = c a.putAt(B、C)
a << b a.leftShift(B)
a >> b a.rightShift(B)
a >>> b a.rightShiftUnsigned(B)
switch(a) { case(b) : } b.isCase(A)
if(a) a.asBoolean()
~a a.bitwiseNegate()
-a a.negative()
+a a.positive()
a as b a.asType(B)
a == b a.equals(B)
a != b a.equals(B)
a <=> b a.compareTo(B)
a > b a.compareTo(B)> 0
a >= b a.compareTo(B)> = 0
a < b a.compareTo(B)<0
a <= b a.compareTo(B)<= 0

スクリプトベースクラス

私たちが実行していることのGroovyスクリプトを自動的にコンパイルするプロセスに継承されるgroovy.lang.Scriptをこの抽象クラス、およびペースは、コンテンツの実行方法を実行するためにバインドされています。

あなたは、バインディングを作成することによって、スクリプト内のパブリック変数と基本クラスを作成することができます

def binding = new Binding()             
def shell = new GroovyShell(binding)    
binding.setVariable('x',1)              
binding.setVariable('y',3)
shell.evaluate 'z=2*x+y'                
assert binding.getVariable('z') == 5   

基本クラスは、カスタマイズすることができます

class BaseScript extends Script{

    String name
    public void greet() { println "Hello, $name!" }

    @Override
    Object run() {
        greet()
    }
}
@BaseScript demo.BaseScript baseScript

setName "100"
greet()

@DelegatesTo

それは我々が閉鎖、ドキュメント生成を実行するために委員会のモデルを使用する場合、IDEと型推論は正確に特定の閉鎖実行は、我々が文を表示するには、このアノテーションを使用する必要がどこに委託された知ることができない、ドキュメントやコンパイル時の注釈です。

我々は効果を実現したい場合は、我々は電子メールの閉鎖を受け、その後、EmailSpecを構築することにより、パターンを作成する方法を定義し、初期の閉鎖を実行するために委任する必要があります

email {
    from '[email protected]'
    to '[email protected]'
    subject 'The pope has resigned!'
    body {
        p 'Really, the pope has resigned!'
    }
}
def email(@DelegatesTo(strategy=Closure.DELEGATE_ONLY, value=EmailSpec) Closure cl) {
    // ...
}

我々は、他のパラメータ法に委託することができた場合

def exec(@DelegatesTo.Target Object target, @DelegatesTo Closure code) {
  // rehydrate方法创建一个闭包副本
   def clone = code.rehydrate(target, this, this)
   clone()
}

カスタムコンパイラ

デフォルトの輸入増加、およびエイリアスのサポート

import org.codehaus.groovy.control.customizers.ImportCustomizer

def icz = new ImportCustomizer()
// "normal" import
icz.addImports('java.util.concurrent.atomic.AtomicInteger', 'java.util.concurrent.ConcurrentHashMap')
// "aliases" import
icz.addImport('CHM', 'java.util.concurrent.ConcurrentHashMap')
// "static" import
icz.addStaticImport('java.lang.Math', 'PI') // import static java.lang.Math.PI
// "aliased static" import
icz.addStaticImport('pi', 'java.lang.Math', 'PI') // import static java.lang.Math.PI as pi
// "star" import
icz.addStarImports 'java.util.concurrent' // import java.util.concurrent.*
// "static star" import
icz.addStaticStars 'java.lang.Math' // import static java.lang.Math.*

ユーザーは、このようなクロージャを使用することはできません、ASTのレベルを制限するために使用される、などが他のパッケージをインポートすることはできません

の構築

Groovyは、公式のチュートリアルを表示するには、特定の利用を便利ビルダーの多くを建て

[公式ガイド](

おすすめ

転載: www.cnblogs.com/freshchen/p/12221925.html