文档章节

lombok系列3:lombok的实验类特性

polly
 polly
发布于 2017/05/19 09:08
字数 1126
阅读 880
收藏 16
点赞 1
评论 4

lombok除了已经推荐使用的基本功能,还维护了一个创新型的注解,有些功能有违常规对java认知,或者只支持eclipse,其他IDE支持有问题,甚至某些环境完全不可用。因此没有正式使用。

但是的确很有创意,这些注解已经在jar中提供,只不过它是归在"lombok.experimental." 包中;而基本功能在"lombok." 包中。

@Accessors

定制流畅的访问器。

@Accessors(chain=true)

链式访问,该注解设置chain=true,生成setter方法返回this,代替了默认的返回void。

package com.pollyduan;

import lombok.Data;
import lombok.experimental.Accessors;

@Data
@Accessors(chain=true)
public class User {
	private Integer id;
	private String name;
	private Integer age;

	public static void main(String[] args) {
		User user=new User().setAge(31).setName("pollyduan");
		System.out.println(user);
	}

}

@Accessors(fluent = true)

chain=true类似,区别在于getter和setter不带set和get前缀。

package com.pollyduan;

import lombok.Data;
import lombok.experimental.Accessors;

@Data
@Accessors(fluent=true)
public class User {
	private Integer id;
	private String name;
	private Integer age;

	public static void main(String[] args) {
		User user=new User().age(31).name("pollyduan");
		System.out.println(user);
	}

}

@Accessors(prefix = "f")

没什么意思,直接看代码。

package com.pollyduan;

import lombok.Data;
import lombok.experimental.Accessors;

@Data
@Accessors(prefix = "f")
public class User {
	private String fName = "Hello, World!";

	public static void main(String[] args) {
		User user=new User();
		user.setName("pollyduan");//注意方法名
		System.out.println(user);
	}

}

@ExtensionMethod

为已经存在的类增加方法。

它可以达到扩展已有类的方法。它之所以作为实验特性,是因为:

在代码风格上冲击较大;
它只是在编码时看起来扩展了普通类的方法,但lombok目前还没有好的办法让运行时其他类引用;
elipse可用,netbeans完全没用;
合法性待考证。

来个例子吧。我们知道我们要对java.util.Date对象进行格式化,通常使用SimpleDateFormat对象来实现,我们能不能给Date对象增加一个format方法呢?come on...

工具类:

package com.pollyduan;

import java.text.SimpleDateFormat;
import java.util.Date;

public class Extensions {
	public static String format(Date date){
		SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		return df.format(date);
	}
}

应用类:

package com.pollyduan;

import java.text.SimpleDateFormat;
import java.util.Date;

import lombok.Data;
import lombok.experimental.ExtensionMethod;

@Data
@ExtensionMethod({java.util.Arrays.class, Extensions.class,SimpleDateFormat.class})
public class ExtensionMethodDemo {
	private void test() {
		Date date=new Date();
		String d=date.format();
		System.out.println(d);
	}
	public static void main(String[] args) {
		new ExtensionMethodDemo().test();
	}

}

实现依据:

假设被扩展类为A,扩展工具类为B,那么就需要在类B中定义个static的方法,该方法有一个参数,类型为A。

然后,在A中添加@ExtensionMethod(B.class) 注解即可。

一个泛型的例子:

//工具方法
public static <T> T or(T obj, T ifNull) {
   return obj != null ? obj : ifNull;
}

//使用
String str=null;
System.out.pritnln(str.or("default_value"));//default_value
str="abcd";
System.out.pritnln(str.or("default_value"));//abcd

@FieldDefaults

设置缺省的字段修饰符。

非常乱,看不下去了,上代码。

package com.pollyduan;

import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.experimental.FieldDefaults;
import lombok.experimental.NonFinal;
import lombok.experimental.PackagePrivate;

@AllArgsConstructor
@FieldDefaults(makeFinal=true, level=AccessLevel.PRIVATE)
public class FieldDefaultsExample {
	public final int a;
	int b;
	@NonFinal int c;
	@PackagePrivate int d;
}

缺省为private final

如果不想使用缺省值,可显式标注,或使用NonFinal取消final。

以上类,相当于:

package com.pollyduan;

public class FieldDefaultsExample {
	public final int a;//明确定义的,不受影响
	private final int b;//未明确定义的,使用注解的private final
	private int c;//指定了NonFinal则只保留private
	final int d;//执行了PackagePrivate,表示使用包私有,即default可见修饰符,只保留final

	public FieldDefaultsExample(int a, int b, int c, int d) {
		super();
		this.a = a;
		this.b = b;
		this.c = c;
		this.d = d;
	}
}

@Delegate

代理方法。

package com.pollyduan;

import java.util.ArrayList;
import java.util.Collection;

import lombok.experimental.Delegate;

public class User {

	private interface SimpleCollection {
		boolean add(String item);
		boolean remove(Object item);
	}

	@Delegate(types = SimpleCollection.class)
	private final Collection<String> collection = new ArrayList<String>();

	public static void main(String[] args) {
		 User user=new User();
		 user.add("item1");//实际上加到collection中去了
	}

}

@Wither

package com.pollyduan;

import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.NonNull;
import lombok.ToString;
import lombok.experimental.Wither;

@AllArgsConstructor
@ToString
public class User {
	@Wither
	private Integer id;
	@NonNull
	@Wither(AccessLevel.PROTECTED)
	private String name;

	public static void main(String[] args) {
		 User user=new User(1001,"pollyduan")
				 .withId(123)
				 .withName("tom");
		 System.out.println(user);
	}

}

执行输出:User(id=123, name=tom)

没明白这种模式有啥用,必须全参构造,然后通过with改。。。。

OnX

乱呀,等脑子清醒再说吧。

@UtilityClass

工具类。

自动将所有域对象修改为static;而且自动创建一个私有的构造器:

private UtilityClassExample() {
 throw new java.lang.UnsupportedOperationException("This is a utility class and cannot be instantiated");
}

@Helper

不知所谓。

package com.pollyduan;

import lombok.experimental.Helper;

public class HelperExample {
	int someMethod(int arg1) {
		int localVar = 5;

		@Helper
		class Helpers {
			int helperMethod(int arg) {
				return arg + localVar;
			}
		}

		return helperMethod(10);
	}
}

相当于:

package com.pollyduan;

public class HelperExample {
	int someMethod(int arg1) {
		int localVar = 5;

		class Helpers {
			int helperMethod(int arg) {
				return arg + localVar;
			}
		}

		return new Helpers().helperMethod(10);//就这点区别,毛用?
	}
}

小结

想法很好,也许哪一天可被接纳,或者被借鉴。

总结起来,有几个个人比较关注,比如:@Delegate 、@ExtensionMethod、@Accessors;在某些环境下,可尝试使用。

© 著作权归作者所有

共有 人打赏支持
polly
粉丝 145
博文 56
码字总数 68534
作品 0
海淀
高级程序员
加载中

评论(4)

notreami
notreami

引用来自“李嘉图”的评论

kotlin就不需要了
kotlin本身就是一种负担。
polly
polly

引用来自“李嘉图”的评论

kotlin就不需要了

@李嘉图 对,发现Kolin借鉴了一些lombok的特性
ihuotui
ihuotui
严重不喜欢这样,增加无端端的学习成本,而且也没有什么作用。
李嘉图
李嘉图
kotlin就不需要了
lombok的使用和原理

一、项目背景 在写Java程序的时候经常会遇到如下情形: 新建了一个Class类,然后在其中设置了几个字段,最后还需要花费很多时间来建立getter和setter方法 lombok项目的产生就是为了省去我们手...

暗之幻影 ⋅ 2015/09/24 ⋅ 5

lombok的使用和原理

一、项目背景 在写Java程序的时候经常会遇到如下情形: 新建了一个Class类,然后在其中设置了几个字段,最后还需要花费很多时间来建立getter和setter方法 lombok项目的产生就是为了省去我们手...

jimyao ⋅ 2016/02/16 ⋅ 0

刚了解到的Lombok,记一下

前言: 逛开源社区的时候无意发现的,用了一段时间,觉得还可以,特此推荐一下。 lombok 提供了简单的注解的形式来帮助我们简化消除一些必须有但显得很臃肿的 java 代码。特别是相对于 POJO...

吴海宏 ⋅ 2014/10/21 ⋅ 0

Lombok学习笔记— 消除冗余java代码

lombok官网:http://projectlombok.org/ lombok开源中国连接:http://www.oschina.net/p/lombok lombok安装: 使用lombok之前是需要进行安装的,否则IDE无法解析lombok注释。安装lombok首先当...

Elven_Xu ⋅ 2016/11/20 ⋅ 0

Lombok 安装、入门 - 消除冗长的 java 代码

前言: 逛开源社区的时候无意发现的,用了一段时间,觉得还可以,特此推荐一下。 lombok 提供了简单的注解的形式来帮助我们简化消除一些必须有但显得很臃肿的 java 代码。特别是相对于 POJO...

AnyLiem ⋅ 2015/07/10 ⋅ 0

Java代码简化神器-Lombok

一、背景   前段时间在开源社区中发现了一个比较牛逼的简化Java代码的神器-Lombok,接着自己写了demo进行测试和练习,感觉真的很不错,特此分享给需要的小伙伴们~ 二、开发之前的准备   1...

hafiz.zhang ⋅ 2016/05/21 ⋅ 0

在eclipse中使用Lombok

1、下载Lombok.jar http://projectlombok.org/downloads/lombok.jar 2、运行Lombok.jar: java -jar D:devjavalibslombok.jar 数秒后将弹出一框,以确认eclipse的安装路径 3、确认完eclipse的......

宛珩 ⋅ 2015/01/27 ⋅ 0

Lombok 安装、入门

前言: 逛开源社区的时候无意发现的,用了一段时间,觉得还可以,特此推荐一下。 lombok 提供了简单的注解的形式来帮助我们简化消除一些必须有但显得很臃肿的 java 代码。特别是相对于 POJO...

qqli ⋅ 2012/12/27 ⋅ 0

lombok 介绍及基本使用方法

lombok 提供了简单的注解的形式来帮助我们简化消除一些必须有但显得很臃肿的 java 代码。特别是相对于 POJO,光说不做不是我的风格,先来看看吧。 lombok 的官方网址:http://projectlombok....

glen_xu ⋅ 2015/12/24 ⋅ 0

lombok cookbook 消除冗长的 java 代码

lombok 提供了简单的注解的形式来帮助我们简化消除一些必须有但显得很臃肿的 java 代码。特别是相对于 POJO, 官网上有 lombok 三分四十九秒的视频讲解,里面讲的也很清楚了,而且还有文档可...

squanchao ⋅ 2016/04/08 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

UI ,前端框架选型

Flat-UI

miaojiangmin ⋅ 8分钟前 ⋅ 0

Istio Service Mesh 教程

Istio Service Mesh 教程 作者 宋净超 | 5400字 | 阅读大约需要11分钟 | 归档于istio | 发表于 2018-05-22 标签 #Istio #教程,来自 https://servicemesher.github.io/blog/istio-service-m...

openthings ⋅ 13分钟前 ⋅ 0

scala swing

scala swing组件的库 https://github.com/scala/scala-swing scala swing的API文档 https://www.scala-lang.org/api/2.9.1/scala/swing/package.html...

whoisliang ⋅ 17分钟前 ⋅ 0

CentOS安装配置Nginx

安装依赖 yum install gcc yum install pcre-devel yum install zlib zlib-devel yum install openssl openssl-devel //一键安装上面四个依赖 yum -y install gcc zlib zlib-devel pcre-deve......

临江仙卜算子 ⋅ 24分钟前 ⋅ 0

开源 java CMS - FreeCMS2.8 依申请公开

项目地址:http://www.freeteam.cn/ 依申请公开 1. 转交申请公开 用户可以把申请公开转交给其他人办理,系统会记录此申请公开的转交记录。 注意:同时只能转交一个申请公开。 选择需要转交的...

freeteam ⋅ 28分钟前 ⋅ 0

以太坊 web3.py 签名转账

以太坊 web3.py 签名转账 本文节选自电子书《Netkiller Blockchain 手札》 Netkiller Blockchain 手札 Mr. Neo Chan, 陈景峯(BG7NYT) 中国广东省深圳市龙华新区民治街道溪山美地 518131 +86...

netkiller- ⋅ 33分钟前 ⋅ 0

年薪40W的程序员必会的技术有哪些?

很多人在问我,程序员如何拿高薪,如何做到年薪40W+,其实总结出来还是一句话,你的技术决定你的能力已经薪资。 那么什么样的技术人才才能拿到一份Java行业里面的高薪呢? 下面是我的一个总结...

码代码的小司机 ⋅ 34分钟前 ⋅ 0

jesque-spring使用及源码分析

1.使用 jesque结合spring使用,步骤如下: 1.1 在项目中添加maven依赖 <dependency> <groupId>net.lariverosc</groupId> <artifactId>jesque-spring</artifactId> <version>1.0.0</ve......

Funcy1122 ⋅ 36分钟前 ⋅ 0

OSChina 周二乱弹 —— 加班的代码不要枉费了我的童子功

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @小小编辑:推荐歌曲《29》- 未完成乐队 《29》- 未完成乐队 手机党少年们想听歌,请使劲儿戳(这里) @FalconChen :#看球提醒# 02:00 巴西v...

小小编辑 ⋅ 今天 ⋅ 16

Docker Swarm的前世今生

概述 在我的《Docker Swarm集群初探》一文中,我们实际体验了Docker Swarm容器集群技术的魅力,与《Kubernetes实践录》一文中提到的Kubernetes集群技术相比,Docker Swarm没有Kubernetes显得...

CodeSheep ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部