Groovy写业务类、框架类的那一吨好处

前端之家收集整理的这篇文章主要介绍了Groovy写业务类、框架类的那一吨好处前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

    作者:江南白衣 @H_502_7@@H_502_7@    前篇:〈在Spring+Hibernate框架下,用动态语言写业务类〉讲述在Spring+Hibernate的架构下,因为动态语言所带来的利益,把一部分业务类改用Groovy编写并编译成Java Class文件。@H_502_7@    而且,因为Groovy的强大与简便,加上与Java亲密无间的关系,一些框架类也可以逐渐考虑用Groovy编写。

@H_502_7@  1.虽然多是星零的好处,但忽然间一整吨好处摆在面前还是很让人感动的。

    除了动态语言和闭包、MOP,Groovy其他的特性多是对J2SE中设计不合理的地方逐一进行修正,集合、IO、字符串操作......虽然多是星零的好处,但忽然间以整吨好处摆在面前还是挺让人感动的。 

   同时,Groovy完全兼容Java语法,但又提供糖糖选择的方式感觉很贴心。(Groovy唯一不支持的java语法就是Inner Class的定义和函数定义里的"throws Exception",私生子的好处啊)

    隐约觉得因为动态语言的无类型,还有闭包这样带着Lisp式FP的印记,加上MOP这样的机制,可能会激发更大的变革发生。@H_502_7@@H_502_7@1.动态类型@H_502_7@   动态类型在Framework型项目中非常重要,多少设计模式呕心沥血,就是为了和这个类型搏斗。@H_502_7@   而且,如果你是把代码编译成java Class,健壮性不会减低太多。@H_502_7@ @H_502_7@2.闭包@H_502_7@    fp的基础,没有闭包的C++用函数指针,java用匿名内部类,都比他差远了。@H_502_7@    详看Matin Flower <闭包>文章的中文版 ,在一段文件操作的Script中试演了一下,果然使代码简洁了好些。@H_502_7@@H_502_7@3. MOP@H_502_7@    Groovy的Team Leader-- Guillaume Laforge最喜欢的一样特性,groovy 嵌入式XML语法的基础,对属性方法访问的intercept 机制。详看另一篇blog。@H_502_7@     又比如,在MOP下,DAO那一堆findByName,findByTitle不用再逐一实现了,实现一个findBy即可拦截其他子虚乌有的findByXXX。@H_502_7@@H_502_7@4.强大的String类
   a.可以直接在String中嵌入EL, "orderBy ${sortColumn}",省了好多"和+号。@H_502_7@   b.hql 可以多行,不用写N多"和+ , 写sql时特别方便。@H_502_7@   c.简单集成了正则表达式@H_502_7@       If ("name"==~ "na.*")@H_502_7@           {println "match!"}

5. 集合与循环的语法@H_502_7@    for (car in cars) { println car } @H_502_7@    for ( e in map ) {  x += e.value}@H_502_7@@H_502_7@    或者@H_502_7@    car.each{print it}@H_502_7@    @H_502_7@    集合也可以直接定义了,如@H_502_7@    def myList = ["Rod",3,Date()] @H_502_7@    def myMap = ["Neeta":31,"Eric":34]@H_502_7@@H_502_7@6.为JDK的基础类扩展了一系列Helper方法
   //原来StringTokenizer类的功能被简单的集成到String类中了@H_502_7@   names.tokenize(",").each{......}@H_502_7@   其他基础类的扩展见Groovy-JDK 

7.简化的Bean定义与赋值

  //自动生成Getter和Setter@H_502_7@   class Customer @H_502_7@   {@H_502_7@      Integer id;@H_502_7@      String name;@H_502_7@   }   @H_502_7@    //简便的对象赋值@H_502_7@   customer = new Customer(id:1,name:"calvin");@H_502_7@   customer2 = new CUstomer(id:2);
重新使对象的属性public,对java滥用getter,setter是一种修正。 @H_502_7@

8. Object内建的反射语法@H_502_7@   customer.getAt("name") //得到属性name, @H_502_7@   customer.invokeMethod("someFunction") //调用方法someFunction@H_502_7@   从此不再需要Apache BeanUtils。

9.GPath--内置的XML语法,和Fremarker类似。@H_502_7@    传说中JDK7.0的功能 jdom和Dom4j可以安息了

   book = new XmlSlurper().parseText("<book writer='calvin'><title>D</title></book>
 
 ")@H_502_7@   println book.title;@H_502_7@   println book[@writer];@H_502_7@   println book.children().size();

10.运算符重载
   //向数组添加对象@H_502_7@   params << customer.getAt(it);@H_502_7@   @H_502_7@   还有如C++的向String,InputStream添加对象.@H_502_7@   还有集合类相加,如list1+list2@H_502_7@@H_502_7@11.简化了IO操作@H_502_7@@H_502_7@12.省略了每行末尾的分号@H_502_7@    既然每行都要的,何必多此一举呢?@H_502_7@    另外return语句也可以省略,不过我还是习惯写:)@H_502_7@@H_502_7@2.Groovy版CustomerDAO的示例:

 

package com.itorgan.myappfuse.dao;import org.springframework.orm.hibernate3.support.HibernateDaoSupport;public class CustomerDAOGroovy  extends HibernateDaoSupport{    public insert(customer)    {        getHibernateTemplate().save(customer)    }    public List getAllValid(sortColumn)    {        def  hql = """from Customer customer               where customer.status='valid'               order by ${sortColumn}"""        def query = getSession().createQuery(hql)        return query.list()    }    public boolean isUnique(customer,uniqueColumnNames)    {        def params = []        def hql = "select count(*) from Customer customer  where  "        def first = true        uniqueColumnNames.tokenize(",").each        {            if (!first)                hql += " or "            else                first = false            hql+="customer.${it}=?"            params << customer.getAt(it)        }        def result = getHibernateTemplate().find(hql,params.toArray())        return ( result.get(0) == 0)    }}

猜你在找的Groovy相关文章