论坛首页 Java企业应用论坛

Lombok简化Java代码 - code for fun

浏览 33335 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-08-24   最后修改:2011-09-03

关于Lombok这个东西,论坛里已经有人介绍过,我也是通过别人帖子了解到这个小工具:

http://www.iteye.com/topic/798305

不过作者以免写Getter/Setter为题来介绍Lombok的优势,看了后面的评论之后,觉得这个工具意义不大.

后来在博客在线看到一篇文章,期中提到了Lombok工具.这个工具已经被国外创业者所使用,随之对其产生了很浓厚的兴趣.

<Java开源建站工具>http://www.jobbole.com/entry.php/1233

 

关于如何介绍Lombok这个工具,自己想了半天,觉得实在比不过作者在首页提供的视频介绍:

http://projectlombok.org/

 

ok~ 写了这么多Lombok到底是什么东西,他具体能带来什么便利呢?

Lombok主要是提供一套注解,根据注解在编译时生成相关代码,目前提供如下注解:

 

 

@Getter / @Setter
永远不用再写 public int getFoo() {return foo;}.
@Getter(lazy=true)
Laziness is a virtue!
@ToString

Lombok会根据field自动生成toString 方法,这个对调试来说很方便! 这个注解生成的toString格式:

 

LombokUser(id=001, name=wity_lv, email=wity_lv@sample.com)
 

 

@EqualsAndHashCode
生成 hashCode and equals 方法.
@NoArgsConstructor@RequiredArgsConstructor and @AllArgsConstructor
Constructors made to order: Generates constructors that take no arguments, one argument per final / non-null field, or one argument for every field.
@Data
All together now: A shortcut for @ToString@EqualsAndHashCode@Getter on all fields, and @Setter on all non-final fields, and @RequiredArgsConstructor!
@Cleanup
Automatic resource management: Call your close() methods safely with no hassle.
@Synchronized
synchronized done right: Don't expose your locks.
@SneakyThrows
To boldly throw checked exceptions where no one has thrown them before!
@Log
支持多种Log工具, 我平时用@Log4j注解
val
Finally! Hassle-free final local variables.
@Delegate
Don't lose your composition.

如何使用?

1. 从项目首页下载lombok.jar

2. 双击lombok.jar, 将其安装到eclipse中(该项目需要jdk1.6+的环境)


 

3. 将Lombok.jar添加到classpath中

4.  编码看看:

 

项目结构:


 

 

package lv.sample.lombok;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.extern.log4j.Log4j;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Log4j
public class LombokUser {
	
	private String id = null;
	private String name = null;
	private String email = null;
	
	public static void main(String[] args) {
		log.info("test the lombok bean");
		
		LombokUser u = new LombokUser("001", "wity_lv", "wity_lv@sample.com");
		System.out.println(u.toString());
		
		LombokUser u2 = new LombokUser("001", "wity_lv", "wity_lv@sample.com");
		System.out.println(u.equals(u2));
	}
}

 
 console out 写道

2011-08-24 11:57:36 test the lombok bean
2011-08-24 11:57:36 LombokUser(id=001, name=wity_lv, email=wity_lv@sample.com)
2011-08-24 11:57:36 true
 

What is happenning???

使用javap看看编译后的代码:


在eclipse outline中显示的结构

 


 

到这里 ~ 这些仅仅只是作者提供一些方便的注释, 当然我们可以fork这个项目的 GitHub, 研究内部原理,构建适合自己团队的Lombok:

https://github.com/rzwitserloot/lombok

 

 

P.S:

[quote="key232323"][quote="曾经de迷茫"]直接 Groovy 吧[/quote] 仅此祭奠那些纯javaer。。。不要再这么纠结了[/quote]

 

从这里楼就歪了...   讨论Groovy,新开贴好吧... 这里你的高谈会被"翻页"掩盖, 也顺便遮盖了你的牛x.

 

关于这个工具我只是分享出来,用不用在个人, 什么Groovy/JRuby, 想用那个都行... Groovy/Ruby我都有用,  Lombokye在用, 楼下请勿再劝我Groovy, 前提是我没有劝各位用一定lombok, 本帖纯属分享.

 

 

回帖讨论的Groovy内容我贴出来

我 写道
曾经de迷茫 写道
直接 Groovy 吧


这个问题提的很好, 我也有考虑.
以前我一直像把Groovy/JRuby引入已有项目.. Groovy中集合了Ruby/Python这些脚本语言的语法优势,让人耳目一新.
有做过尝试,使用Groovy还是需要一定的上手时间,项目紧了,估计会扔一边了.

Lombok 和 Groovy对比的问题, 值得研究. Groovy是从语法出发,将java脚本化, Lombok更关注代码片段, 将各种最佳实践用注解来代替.

Spring/Hibernate用注解代替配置. Lombok用注解代替部分代码.

ke232323提到的资源不错.
ke232323 写道
groovy引入到项目,还有什么额外的工作不成?

两种方式,一种直接groovy代码,编译成class再部署,开发方式一点变化都没有。

令一种用groovy源文件,用classloader去defineClass然后load,继续以前的开发方式。

至于快速从javaer 到 javaer * 30% + groovyer * 70%,

如果你java基础ok,3天,分别看3个文档,就ok了——

分别是
groovy-manning.groovy.in.action.2007.pdf
groovy-userguide.pdf
http://blog.csdn.net/hivon/article/details/4256296

我 写道
这个跑题跑的...
我有尝试Groovy, 一个新项目用的就是Grails, 原有项目集成Groovy要成本,有引入的时间我早把活干完了.
集成Groovy有我知道的有3中方式,
1. 编译后引用, Groovy->compile to -> *.class 然后java应用, 这个问题有循环引用的问题
2. 用BSF直接以脚本的方式引用Groovy
3. 依赖Spring, GroovyBean 添加到Spring配置文件中.

在你的blog没看到groovy相关主题, 不知道你是否有实践. 对这个有兴趣讨论的话可以单开主题讨论.

 

key232323 写道
qiuboboy 写道

groovy我关注过一阵子,但是我对他的性能实在是看不过去,你把他生成的class反编译回去,看着蛋疼,估计java7后有所改善。


这一点不假——

不过编译过的class进行缓存后,也不过是多执行了一些method invoke方法而已,方法栈多出的数量级比spring框架bean的调用少多了——而且性能一般不在这儿,你可以用这样的代码做测试:

currentSec

loadClass()
newInstance()
invokeMethod(obj, 'testMethod')

endSec

其中
testMethod是用Sql批处理向数据库插入100条数据,分页查询出来100条,

你同样用java写这个testMethod(顺便看看jdbc和ibatis或spring jdbctemplate的性能差距)

在并发,用jmeter的junit做并发测试,你就会看到性能到底有差多少了——我一会儿再把这个写一遍跑个试试。
 
  • 大小: 70.5 KB
  • 大小: 63.7 KB
  • 大小: 117.2 KB
  • 大小: 16.2 KB
   发表时间:2011-08-24  
lombok用过不错 对开发简单的javaBean很有帮助
0 请登录后投票
   发表时间:2011-08-25  
没看出哪好-_-||
0 请登录后投票
   发表时间:2011-08-25  
估计调试比较困难
0 请登录后投票
   发表时间:2011-08-25  
有点意思,不过不够彻底……
spring roo貌似更猛,一句注解搞定一个领域模型
java都朝这样的方向发展么?
0 请登录后投票
   发表时间:2011-08-25  
volking 写道
估计调试比较困难

Debug 我还没试过..
有Delombok工具, 将注解转化成java代码. 这个工具作者是为GWT设计的.
Debug如果有问题可以用这个
0 请登录后投票
   发表时间:2011-08-25  
KimHo 写道
有点意思,不过不够彻底……
spring roo貌似更猛,一句注解搞定一个领域模型
java都朝这样的方向发展么?


少量的代码,完成更多的工作.肯定是这么发展.
Roo生成的东西太多了, 真正用起来心里没底...
0 请登录后投票
   发表时间:2011-08-25   最后修改:2011-08-25
jackra 写道
没看出哪好-_-||

特点是,简单,易用...

我最常用的是@Data 和 @Log4j 这两个注解. 省不少事.

@Data
@Log4j
@XmlRootElement(name="user")
@XmlAccessorType(XmlAccessType.FIELD)
public class User {
	
	private String id = null;
	private String name = null;
	private String password = null;

	private String workCode = null;
	
	private String telephone = null;
	private String email = null;
	
	public User() {
		
	}
	
	/**
	 * create user from DyeResourceTools.jar
	 * @param userInfo
	 * @return
	 */
	public static User fromUserInfo(UserInfo userInfo) {
		if(userInfo == null) {
			log.warn("occur a null userInfo parameter on creating user.");
			return null;
		}
		
		User user = new User();
		
		user.setId(userInfo.getStrUserId());
		user.setName(userInfo.getStrName());
		
		user.setWorkCode(userInfo.getStrWorkCode());
		
		user.setTelephone(userInfo.getStrTelephone());
		user.setEmail(userInfo.getStrEmailAddress());
		
		return user;
	}
}


这代码看起来多清爽
0 请登录后投票
   发表时间:2011-08-25  
直接 Groovy 吧
0 请登录后投票
   发表时间:2011-08-25  
没啥好处啊,有些注解需要需要写在方法上!!!!!!!!
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics