3.lombok系列3:lombok的实验类特性
转自:https://blog.csdn.net/54powerman/article/details/72516755
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;在某些环境下,可尝试使用。
3.lombok系列3:lombok的实验类特性的更多相关文章
- 1.lombok系列1:初识lombok
转自:https://www.imooc.com/article/18156 初识lombok 官网:https://projectlombok.org/ 什么是lombok 连官网都懒得废话,只给出 ...
- 2.lombok系列2:lombok注解详解
转自:https://www.imooc.com/article/18157 开篇 看到第一篇<初识lombok>你可能意犹未尽,本文我们按照场景来介绍一下常用的注解. 未特别说明,均标注 ...
- 封装一个简单好用的打印Log的工具类And快速开发系列 10个常用工具类
快速开发系列 10个常用工具类 http://blog.csdn.net/lmj623565791/article/details/38965311 ------------------------- ...
- 【ABAP系列】SAP ABAP 资产类BAPI过账 BAPI_ACC_DOCUMENT_POST
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP 资产类BAPI ...
- 【springboot】【idea】实体类免写get、set等方法,使用lombok依赖和插件的@Data类注解
需求,一个实体类,规范写法一定要对应的get.set方法,有必要还要重写toString方法.虽然可以快速生成get.set等方法,但是如果要添加或减少成员属性时就得重新生成get.set等方法. 而 ...
- lombok系列(一)
如果在类上面使用@Builder注解, @Builder public class A { } controller中使用: public String test(@RequestBody A a){ ...
- 【DWR系列03】- DWR主要类详解
img { border: 1px solid black } 一.简介 首先应该了解这个jar包主要的类,了解了类,就了解了DWR.DWR的在线javadoc:http://directwebrem ...
- .NET面试题系列[10] - IEnumerable的派生类
.NET面试题系列目录 IEnumerable分为两个版本:泛型的和非泛型的.IEnumerable只有一个方法GetEnumerator.如果你只需要数据而不打算修改它,不打算为集合插入或删除任何成 ...
- spring源码分析系列 (5) spring BeanFactoryPostProcessor拓展类PropertyPlaceholderConfigurer、PropertySourcesPlaceholderConfigurer解析
更多文章点击--spring源码分析系列 主要分析内容: 1.拓展类简述: 拓展类使用demo和自定义替换符号 2.继承图UML解析和源码分析 (源码基于spring 5.1.3.RELEASE分析) ...
随机推荐
- 如何更改jar包源码
首先将你要更改的源码文件在eclipse中编译成.class文件 再找到你需要更改的.jar包 在桌面右键新建个文件夹把你要改的.jar包ctrl+c和ctrl+v 准备好一个压缩工具(这里推荐234 ...
- 关于HTML5和CSS3的几个“新增”
html5和css3分别是目前最新的web前端编程的标准,加入了新的标准和要求. 1.HTML5新增input输入类型,即type后面的值 文本域 <input type="text& ...
- JS实现PC端全兼容复制
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- C#解决System.Security.Cryptography.MD5.Create()调用的目标发生了异常)的问题
今天搭建微信扫码支付环境的时候,一样的配置参数,调用连接提示错误 错误:调用的目标发生了异常 然后跟踪到执行 MD5 md5 = System.Security.Cryptography.MD5.Cr ...
- 新手教程:电信+广电(或其他运营商)双WAN设置
由于国内不同运营商之间互联互通存在问题,假如用联通的线路去访问电信的站点那么会比较卡,反之亦然:所以如果两个WAN的线路不是同一个运营商,一般都是建议用户双WAN模式选为“智能路由”.经过本人测试发现 ...
- Hexo 添加自定义的内置标签
灵感 想设计一个记录自已骑行的页面,显示时间.地点.路线图等信息.方便以后做一些留念.定位想实现下面类似的效果.参考:<特效> 实现方案也比较简单,反键查看源码.直接Copy,在 ...
- python code 1_username registration & login
This tiny program consists of 2 parts - registration and login. In the part of registration, the key ...
- Swift学习笔记(12)--数组和字典的复制
Swift中,数组Array和字典Dictionary是用结构来实现的,但是数组与字典和其它结构在进行赋值或者作为参数传递给函数的时候有一些不同. 并且数组和字典的这些操作,又与Foundation中 ...
- 洛谷 P2080 增进感情
P2080 增进感情 题目背景 小明和小红的感情,是慢慢发展起来的. 题目描述 他们对对方分别有一个好感值.定义两人的亲密程度为两人的好感值之和. 如果他们的亲密程度达到V,则他们将走到一起.他们以后 ...
- ASPNET 页面编码
转自:http://www.cnblogs.com/libingql/archive/2009/04/11/1433771.html 设置ASPNET页面编码格式 1.Web.Config设置 < ...