阅读了《Groovy In Action》一书,做了网上调研,经历了最初的FUD(Fear, uncertainty, doubt )过程,最终决定使用Groovy代替Java来写JBoss Seam组件。
本文是近一个月来, 使用Groovy编程的几点粗浅的体会。最后展示了一些Groovy源代码。
1.好处
(1)代码变得非常简洁,能够直接把程序的意图表现出来。同样的功能,很难想象再回到Java去编程。
(2)闭包(Closure)的使用,大大简化了某些算法,尤其是集合操作,开发效率大为提高。
(3)可以用JavaScript的感觉去写Groovy程序,因为两者都属于动态类型语言。
2.不便之处
(1)Groovy Eclipse Plugin的当前版本(2008-01-03发表)的编译速度还比较慢,功能上太弱。希望在未来的几个月中,这种情况能得到改变。
(2)编译阶段,对方法名引用错误,或者方法传递参数的错误,不再提示,要等到运行时才能发现。
(3)GlassFish中检测不到Groovy编写的类的修改,无法获得自动加载的热部署好处。
3.不确定之处
(1)是否会影响到整个后台程序的运行速度?
(2)是否能被开发团队中其他成员接受和欢迎?
4.Groovy代码展示1:Hibernate实体类
package com.divo.app.domain
import javax.persistence.*
import org.jboss.seam.annotations.*
//网格视图-用户版本
@Entity
@Name("app.myGridView")
@Table(name="app_MyGridView",uniqueConstraints = [
@UniqueConstraint(columnNames =
["viewId", "userId"] )
])
class MyGridView {
@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator="appNextId")
@TableGenerator(name="appNextId", table="app_NextId", allocationSize=1)
Long id
@Column(nullable=false)
Long userId
@Column(nullable=false)
Long viewId
@Column(nullable=false,length=4000)
String viewState
}
//EOP
5.Groovy代码展示2:作为JBoss Seam组件的服务类
package com.divo.app.service
import org.hibernate.*
import org.jboss.seam.annotations.*
import org.jboss.seam.security.*
import com.divo.app.domain.*
import com.divo.core.misc.*
import com.divo.core.util.*
@Name("app.appInfoService")
@AutoCreate
class AppInfoService extends BaseService {
String appInfoFileName
def getAppInfo() {
def dir = appInfoFileName?"":AppUtil.getRootDir()
def s = Constants.FILE_SEPARATOR
def fileName = appInfoFileName?appInfoFileName:"app${s}version.txt"
def file = new File(dir+fileName)
def appInfo = new AppInfo()
def count = 0
file.splitEachLine(/\,/){
if (it.size()>1 && count>0) {
appInfo.version = it[0]
appInfo.buildId = it[1]
appInfo.copyright = it[2]
appInfo.productName = it[3]
appInfo.isDebug = (it[6]=="Y" || it[6]=="y")
}
count++
}
appInfo.currentDate = DateTimeUtil.getNowDate()
appInfo.contextPath = appInfoFileName?"":AppUtil.getContextPath()
appInfo
}
}
//EOP
6.Groovy代码展示3:单元测试类
package com.divo.app.service.test
import org.testng.annotations.*
import com.divo.app.service.*
import com.divo.core.util.*
import com.divo.core.misc.*
class AppInfoServiceTest extends AppTestCase {
def _service
@BeforeClass
@Override
void init() {
super.init()
_service = new AppInfoService()
}
@BeforeMethod
@Override
void begin() {
super.begin()
_service.setSession(session)
}
@Test
void canGetAppInfo() {
_service.appInfoFileName = "test//version.txt"
def appInfo = _service.getAppInfo()
def currentDate = DateTimeUtil.getNowDate()
assert appInfo.version=="2.0.0-b1"
assert appInfo.buildId=="2008020112"
assert appInfo.copyright=="fzx"
assert appInfo.productName=="软件问题跟踪系统"
assert appInfo.currentDate==currentDate
}
}
//EOP