Groovy探索 关于方法名的DSL

Groovy语言最引以为豪的特点就是DSL了,关于DSL的定义以及分类、优点等,就不是本篇所要阐述的了,大家可以上网查,网上有大量的这方便的介绍。Groovy语言是非常便于设计内部DSL了,在这方面,我的Groovy探索系列已经有了很多专题谈到过使用Groovy语言创建内部DSL的一些方面。本篇所要探索的是一个关于Groovy语言DSL的一个非常小的方面、也是非常不起眼的方面:关于方法名的DSL。

说到方法名的DSL,其实我们在Groovy语言中已经有了非常广泛的应用。比如,我们在一开始学习Groovy语言,就会写一个“HelloWorld”的程序来开始我们的第一个Groovy语言程序,它的代码大致如下:

public class HelloWorld{

/**
* @param args
*/
public static void main(def args){
// TODO Auto-generated method stub

println 'Hello,World!'

}

}

它的运行结果就不要我多说了。我们感兴趣的是“println”方法,我们都知道,在Java语言中,该对应的方法是“System.out.println”。将长的方法名——“System.out.println”写成了“println”,就是Groovy语言中关于方法的DSL的一个应用。这样的好处主要是两个方面:第一是编码的快捷性增加,输入“println”当然也输入“System.out.println”方便了很多;第二就是可读性的增强,这是DSL的追求,“println”的可读性也比“System.out.println”强。

那么,我们在实际的编码过程中,又该如何实现形如“println”这样的DSL呢?

关于方法名的DSL,在Groovy语言中,有三种实现方法,先说其中的两种,它们分别是静态引入和使用“as”关键字。我们还是以一个例子来说明。

比如,我们想取得系统的当前时间,Java语言的方式是如下的:

System.out.println(System.currentTimeMillis())

有了静态引入,我们在Groovy语言中的编码将是这样的:

import static System.currentTimeMillis

/**
* @author Administrator
*
*/
public class Testor2{

/**
* @param args
*/
public static void main(def args){
// TODO Auto-generated method stub

println currentTimeMillis()

}

}

当然,我们还可以更进一步,使用“as”关键字的代码则会是这样的:

import static System.currentTimeMillis as now

/**
* @author Administrator
*
*/
public class Testor2{

/**
* @param args
*/
public static void main(def args){
// TODO Auto-generated method stub

println now()

}

}

时间: 2025-01-27 12:02:24

Groovy探索 关于方法名的DSL的相关文章

Groovy探索之MOP 十五 方法名的动态性

到目前为止,我们的<Groovy探索之MOP>系列已经谈到了使用ExpandoMetaClass的方方面面,但值得注意的是,我们通过ExpandoMetaClass给一个类在运行期内添加一个方法,不管是普通方法还是静态方法,我们都是添加一个确定方法名的方法.即我们添加一个方法名为A的方法,然后才能使用这个方法A. 然而,方法名的动态性,其实是我们早已接触过的事情,比如在<Groovy探索之invokeMethod方法>里,我们就可以创建形如"sortByXxxxx()&q

Groovy探索之对Java语言反射的简化

Java语言的反射功能是我们不得不使用的功能,但事实上它的使用是相当繁琐却在功能上比较单一的一个功能. 例如,我们使用Java语言反射最多的地方是在运行时对POJO对象或者Domain对象的"set"和"get"方法的调用,因为对象属性是私有的,获取和设置对象属性的值是通过对应的"get"和"set"方法进行的.下面是一个关于"get"方法调用的例子: public static Object getFie

java-Jsp+Servlet怎么在form中指定要访问的servlet中的方法名

问题描述 Jsp+Servlet怎么在form中指定要访问的servlet中的方法名 Jsp+Servlet怎么在form中指定要访问的servlet中的方法名,在Jsp中写了一个form,然后想指定访问servlet中的regist()方法,而不是doGet()或者doPost()方法,应该怎么样指定 解决方案 servlet只能指定post,get请求,你随便请求一个,在调一下regist()呗,或者重写父类service方法,在里面加入regist() 解决方案二: dopost里面判断调

Groovy探索 自定义Range 二 自定义Range类与Decorate模式

Decorate模式相信大家都比较熟悉了,是一个"BangOfFour"中最常用的模式之一,实现起来也相当的简单.如果有人不熟悉的话,可以看看<Groovy探索之Decorate模式>,那里面有一个本篇要沿用的例子. 这个例子就是咖啡馆里买咖啡的经典例子,咖啡有原味咖啡,还有根据顾客口味不同进行各种添加,比如加冰.加奶和加糖等等.顾客可以选择不加.加一样或加多样,各种加法的咖啡所买的价格也不一样. 这个例子是Decorate模式实现的最经典的例子.我们在这里希望使用自定义R

Groovy探索 自定义Range 三 自定义Range与责任链模式

责任链模式也是我们比较常用的一种模式,我在<Groovy探索之责任链模式>中有个探索.大家也可以在网上搜索,应该有很多这方面的文章. 在这里,我们将使用自定义的Range类来实现责任链模式,使用的例子还是在<Groovy探索之责任链模式>一文中所谈到的"孙悟空大战二郎神"的这个情节.这样,我们可以把这两篇的文字结合起来看,使得我们能够对比这两种开发方式.使得我们能够深入的理解自定义Range类的使用. 在"孙悟空大战二郎神"这个情节里,重点讲

Groovy探索之MOP 十三 Interceptor 三(2)

其实,阻止拦截的使用像在<Groovy探索之MOP 十三 Interceptor 三(1)>中的最后一个例子那像的使用并不多,更多的是在使用拦截器的客户那里决定是否使用拦截器.还是上一篇的那个例子: class Hello { def hello(name) { "hello,$name" } } 我们现在明确的把类中所有的方法进行拦截,拦截器如下: class AllInterceptor implements Interceptor{ Object beforeInvo

Groovy探索之MOP 十三 Interceptor 三(1)

本篇的"Interceptor",主要是来说说拦截器的阻止拦截的问题,这个问题是我们自定义拦截器时经常要遇到的挑战之一. 与阻止拦截很近的一个意思是不拦截,即我们可以拦截某个方法,但我们不对拦截做任何实质性的动作,即我们简单的将拦截的动作放行.这是一种被动的不拦截行为.而我们的阻止拦截却更为主动一些,即不让拦截器拦截到某个方法. 下面,我们将分别就放行拦截和阻止拦截来举例说明. 首先,我们还是设计一个需要被拦截的类来: class Foo { def foo() { println '

Groovy探索之MOP 十二 方法的调用顺序

我们知道,除了使用hook来拦截方法以外,我们还可以通过各种方式来实现方法.如,我们可以在类里直接实现方法:我们可以通过ExpandoMetaClass在运行期内添加方法:我们还可以通过ExpandoMetaClass在运行期内单独给一个对象添加方法. 所有的这些直接添加方法的途径,如果存在hook的话,都是要被hook拦截的.所以,我们可以说,系统是优先调用hook的. 而hook的调用顺序,我们在上一篇<Groovy探索之MOP 十一 运行期内覆盖invokeMethod>已经谈到过了.

Groovy探索之MOP 十一 运行期内覆盖invokeMethod

我们很早就会使用Groovy语言的hook,即"invokeMethod"方法和其他的几个方法.我们会在一个类中实现"invokeMethod"方法,用来分派所有的或部分的在运行期内调用的该类实例的方法.这些我们在<Groovy探索之MOP 一 invokeMethod和methodMissing方法>已经详细的谈到过. 现在,我们已经深入的接触到了Groovy语言的MetaClass,更是也到处使用到了ExpandoMetaClass.我们都已经知道,