lombok深入实践
官网视频
官网地址:https://projectlombok.org
官网的首页视频演示在eclipse中如何使用Lombok;
Project Lombok is a java library that automatically plugs into your editor and build tools, spicing up your java.
Never write another getter or equals method again, with one annotation your class has a fully featured builder, Automate your logging variables, and much more.
翻译:
Lombok项目是一个java的库,可以自动的通过插件的方式安装到你的编辑器和构建工具中,给你的Java代码调味,再也不用写 getter和equals方法了,通过一个类上的注解你拥有了建造者的特征,自动的声明了一个日志变量,还有更多功能;
特征列表
val
自由使用final本地变量;
从0.10版本开始引入
你可以使用val作为本地变量的申明,来替代写它的实际类型。如果你这样做了,类型将会从初始化表达式中被推断,本地变量也会被设置为final,这个特征工作在如下场景:
1.本地变量;
2.foreach循环;
在类的成员中并不会生效,初始化表达式是需要的。
val实际上是一个类型的排序,作为一个真实的类存在于lombok的包中,你必须引入val才能工作(或者使用lombok.val作为类型),在本地变量声明中这种类型的存在会触发两个操作:
1.增加final关键字;
2.复制初始化表达式的类型,用来重写这个伪造的val类型;
注意这个功能在netbeans中不会起作用;
注意事项:
对于混合的类型,会推断得到公共的父类,而不是共享的接口。
在含糊的场景下:如果初始化为null,会推断得到Object.
实例代码:不适用lombok;
package com.springpractice._val;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
/**
* Hello world!
*/
public class App {
public String test1() {
final ArrayList<String> exampleList = new ArrayList<>();
exampleList.add("hello world");
final String firstElement = exampleList.get(0);
final String returnString = firstElement.toLowerCase();
System.out.println(returnString);
return returnString;
}
public void test2() {
final HashMap<Integer, String> map = new HashMap<>();
map.put(0, "zero");
map.put(5, "five");
for (final Map.Entry<Integer, String> entry : map.entrySet()) {
System.out.printf("%d: %s \n", entry.getKey(), entry.getValue());
}
}
public static void main(String[] args) {
final App app = new App();
app.test1();
System.out.println("======");
app.test2();
}
}
使用lombok ;
package com.springpractice._val;
import lombok.val;
import java.util.ArrayList;
import java.util.HashMap;
/**
* Hello world!
*/
public class AppLombok {
//不能使用在类的成员变量上,会报编译错误
// val String name;
public String test1() {
val exampleList = new ArrayList<String>();
exampleList.add("hello world");
val firstElement = exampleList.get(0);
final String returnString = firstElement.toLowerCase();
System.out.println(returnString);
return returnString;
}
public void test2() {
val map = new HashMap<Integer, String>();
map.put(0, "zero");
map.put(5, "five");
for (val entry : map.entrySet()) {
System.out.printf("%d: %s \n", entry.getKey(), entry.getValue());
}
}
public static void main(String[] args) {
final AppLombok app = new AppLombok();
app.test1();
System.out.println("======");
app.test2();
}
}
var
替代本地变量;
package com.springpractice._var;
import lombok.var;
import java.awt.*;
/**
* 说明:var的使用
* @author carter
* 创建时间: 2019年10月10日 20:08
**/
public class App {
public static void main(String[] args) {
var x = "Hello";
//编译报错,类型是String
// x=1;
var y = Color.RED;
// y=x;
//var的类型如果是object ,则不是它的使用场景
var z = new Object();
z = x;
System.out.println(x);
}
}
NonNull
自动检查,告别NPE的爱恨情仇。
不使用lombok;
package com.springpractice.nonnull;
import lombok.NonNull;
import java.util.Objects;
/**
* 说明:TODO
* @author carter
* 创建时间: 2019年10月10日 20:16
**/
public class App extends Something{
private String name;
public App(Person person){
super("Hello");
if (Objects.isNull(person)){
throw new NullPointerException("person is marked @NonNull but is null");
}
this.name = person.getName();
}
public static void main(String[] args) {
new App(null);
}
}
使用lombok;
package com.springpractice.nonnull;
import lombok.NonNull;
/**
* 说明:TODO
* @author carter
* 创建时间: 2019年10月10日 20:20
**/
public class AppLombok extends Something {
private String name;
public AppLombok(@NonNull Person person){
super("Hello");
this.name = person.getName();
}
public static void main(String[] args) {
new AppLombok(null);
}
}
效果一样:
/Library/Java/JavaVirtualMachines/jdk1.8.0_102.jdk/Contents/Home/bin/java -Dfile.encoding=UTF-8 -classpath /Library/Java/JavaVirtualMachines/jdk1.8.0_102.jdk/Contents/Home/jre/lib/charsets.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_102.jdk/Contents/Home/jre/lib/deploy.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_102.jdk/Contents/Home/jre/lib/ext/cldrdata.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_102.jdk/Contents/Home/jre/lib/ext/dnsns.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_102.jdk/Contents/Home/jre/lib/ext/jaccess.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_102.jdk/Contents/Home/jre/lib/ext/jfxrt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_102.jdk/Contents/Home/jre/lib/ext/localedata.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_102.jdk/Contents/Home/jre/lib/ext/nashorn.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_102.jdk/Contents/Home/jre/lib/ext/sunec.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_102.jdk/Contents/Home/jre/lib/ext/sunjce_provider.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_102.jdk/Contents/Home/jre/lib/ext/sunpkcs11.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_102.jdk/Contents/Home/jre/lib/ext/zipfs.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_102.jdk/Contents/Home/jre/lib/javaws.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_102.jdk/Contents/Home/jre/lib/jce.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_102.jdk/Contents/Home/jre/lib/jfr.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_102.jdk/Contents/Home/jre/lib/jfxswt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_102.jdk/Contents/Home/jre/lib/jsse.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_102.jdk/Contents/Home/jre/lib/management-agent.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_102.jdk/Contents/Home/jre/lib/plugin.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_102.jdk/Contents/Home/jre/lib/resources.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_102.jdk/Contents/Home/jre/lib/rt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_102.jdk/Contents/Home/lib/ant-javafx.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_102.jdk/Contents/Home/lib/dt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_102.jdk/Contents/Home/lib/javafx-mx.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_102.jdk/Contents/Home/lib/jconsole.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_102.jdk/Contents/Home/lib/packager.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_102.jdk/Contents/Home/lib/sa-jdi.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_102.jdk/Contents/Home/lib/tools.jar:/Users/lifesense-szyf01/src/git/github/springbootpractice/lombok-demo/target/classes:/Users/lifesense-szyf01/.m2/repository/org/projectlombok/lombok/1.18.8/lombok-1.18.8.jar com.springpractice.nonnull.AppLombok
Exception in thread "main" java.lang.NullPointerException: person is marked non-null but is null
at com.springpractice.nonnull.AppLombok.<init>(AppLombok.java:15)
at com.springpractice.nonnull.AppLombok.main(AppLombok.java:21)
Process finished with exit code 1
代码路径: git@github.com:carterbrother/springbootpractice.git/lombok-demo
原创不易,转载请注明出处。
lombok深入实践的更多相关文章
- 🏆【Java技术专区】「开发实战专题」Lombok插件开发实践必知必会操作!
前言 在目前众多编程语言中,Java 语言的表现还是抢眼,不论是企业级服务端开发,还是 Andorid 客户端开发,都是作为开发语言的首选,甚至在大数据开发领域,Java 语言也能占有一席之地,如Ha ...
- SpringBoot教程——检视阅读
SpringBoot教程--检视阅读 参考 SpringBoot教程--一点--蓝本--springboot2.1.1 SpringBoot教程--易百--springboo2.0.5.RELEASE ...
- lombok自定义扩展实践
lombok是一款能够在java代码编译阶段改变代码的插件.比如生成setter和getter方法,生成log类变量等,能够简化一些特定的模版式代码.本文将以实现一个基于特定注解生成日志代码的方式,简 ...
- Java 小记 — Spring Boot 的实践与思考
前言 本篇随笔用于记录我在学习 Java 和构建 Spring Boot 项目过程中的一些思考,包含架构.组件和部署方式等.下文仅为概要,待闲时逐一整理为详细文档. 1. 组件 开源社区如火如荼,若在 ...
- Spring Boot开发MongoDB应用实践
本文继续上一篇定时任务中提到的邮件服务,简单讲解Spring Boot中如何使用MongoDB进行应用开发. 上文中提到的这个简易邮件系统大致设计思路如下: 1.发送邮件支持同步和异步发送两种 2.邮 ...
- 后端开发实践——Spring Boot项目模板
在我的工作中,我从零开始搭建了不少软件项目,其中包含了基础代码框架和持续集成基础设施等,这些内容在敏捷开发中通常被称为"第0个迭代"要做的事情.但是,当项目运行了一段时间之后再来反 ...
- spring-boot-2.0.3之quartz集成,最佳实践
前言 开心一刻 快过年了,大街上,爷爷在给孙子示范摔炮怎么放,嘴里还不停念叨:要像这样,用劲甩才能响.示范了一个,两个,三个... 孙子终于忍不住了,抱着爷爷的腿哭起来:爷呀,你给我剩个吧! 新的一年 ...
- java AOP使用注解@annotation方式实践
java AOP使用配置项来进行注入实践 AOP实际开发工作比较常用,在此使用注解方式加深对面向切面编程的理解 废话不多少,先看下面的实例代码 场景: 1.未满一岁的小孩,在执行方法之前打印:“ ...
- Android ------ 美团的Lint代码检查实践
概述 Lint是Google提供的Android静态代码检查工具,可以扫描并发现代码中潜在的问题,提醒开发人员及早修正,提高代码质量.除了Android原生提供的几百个Lint规则,还可以开发自定义L ...
随机推荐
- HA-高可用集群
原理:两台web服务器,通过心跳线进行通信,当主节点出现服务异常,备用节点通过探测判断主节点是否存活,若是不存活,就把服务接管过来. Web1和Web2中间有一根心跳线,检查对方的存活状态.流动IP: ...
- MySQL的安装、启动和基础配置 —— linux版本
环境和资源地址 *** centos 7 *** http://repo.mysql.com/yum/mysql-5.6-community/ 安装 安装方式一(在线安装): # 查看和mysql有关 ...
- 《一头扎进》系列之Python+Selenium框架设计篇4- 价值好几K的框架,呵!这个框架有点意思啊
1.简介 前面文章,我们实现了框架的一部分功能,包括日志类和浏览器引擎类的封装,今天我们继续封装一个基类和介绍如何实现POM.关于基类,是这样定义的:把一些常见的页面操作的selenium封装到bas ...
- Java String indexOf()方法
public class Test { public static void main(String[] args) { String s = "xXccxxxXX"; // 从头 ...
- HttpRunner学习11--指定用例运行次数
前言 在HttpRunner中,一般情况下,我们写的用例脚本都是每次运行一次,如果我们想要指定用例运行的次数,可以通过 times 关键字来实现. 测试场景 在这里,我们以访问 TesterHome ...
- HttpRunner学习4--使用正则表达式提取数据
前言 在HttpRunner中,我们可通过extract提取数据,当响应结果为 JSON 结构,可使用 content 结合 . 运算符的方式,如 content.code,用起来十分方便,但如果响应 ...
- python的tqdm模块介绍
https://www.jianshu.com/p/b27318efdb7b Tqdm 是 Python 进度条库,可以在 Python 长循环中添加一个进度提示信息用法:tqdm(iterator) ...
- 服务发现(consul)搭建
服务发现(consul)搭建 下载最新版 consul 本人使用的版本为1.5.1,操作系统:window server 2008 consul部署的时候分为客户端和服务端,本次操作服务器2台,客户端 ...
- EVERSPIN非易失性存储器具吸引力嵌入式技术
相关研究指出,如果以嵌入式MRAM取代微控制器中的eFlash和SRAM,可节省高达90%的功耗:如果采用单一晶体管MRAM取代六个晶体管SRAM,则可实现更高的位元密度和更小的芯片尺寸,这些功率与面 ...
- 面试连环炮系列(十二):说说Atomiclnteger的使用场景
说说Atomiclnteger的使用场景 AtomicInteger提供原子操作来进行Integer的使用,适合并发情况下的使用,比如两个线程对同一个整数累加. 为什么Atomiclnteger是线程 ...