官网视频

官网地址: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深入实践的更多相关文章

  1. 🏆【Java技术专区】「开发实战专题」Lombok插件开发实践必知必会操作!

    前言 在目前众多编程语言中,Java 语言的表现还是抢眼,不论是企业级服务端开发,还是 Andorid 客户端开发,都是作为开发语言的首选,甚至在大数据开发领域,Java 语言也能占有一席之地,如Ha ...

  2. SpringBoot教程——检视阅读

    SpringBoot教程--检视阅读 参考 SpringBoot教程--一点--蓝本--springboot2.1.1 SpringBoot教程--易百--springboo2.0.5.RELEASE ...

  3. lombok自定义扩展实践

    lombok是一款能够在java代码编译阶段改变代码的插件.比如生成setter和getter方法,生成log类变量等,能够简化一些特定的模版式代码.本文将以实现一个基于特定注解生成日志代码的方式,简 ...

  4. Java 小记 — Spring Boot 的实践与思考

    前言 本篇随笔用于记录我在学习 Java 和构建 Spring Boot 项目过程中的一些思考,包含架构.组件和部署方式等.下文仅为概要,待闲时逐一整理为详细文档. 1. 组件 开源社区如火如荼,若在 ...

  5. Spring Boot开发MongoDB应用实践

    本文继续上一篇定时任务中提到的邮件服务,简单讲解Spring Boot中如何使用MongoDB进行应用开发. 上文中提到的这个简易邮件系统大致设计思路如下: 1.发送邮件支持同步和异步发送两种 2.邮 ...

  6. 后端开发实践——Spring Boot项目模板

    在我的工作中,我从零开始搭建了不少软件项目,其中包含了基础代码框架和持续集成基础设施等,这些内容在敏捷开发中通常被称为"第0个迭代"要做的事情.但是,当项目运行了一段时间之后再来反 ...

  7. spring-boot-2.0.3之quartz集成,最佳实践

    前言 开心一刻 快过年了,大街上,爷爷在给孙子示范摔炮怎么放,嘴里还不停念叨:要像这样,用劲甩才能响.示范了一个,两个,三个... 孙子终于忍不住了,抱着爷爷的腿哭起来:爷呀,你给我剩个吧! 新的一年 ...

  8. java AOP使用注解@annotation方式实践

       java AOP使用配置项来进行注入实践 AOP实际开发工作比较常用,在此使用注解方式加深对面向切面编程的理解 废话不多少,先看下面的实例代码 场景: 1.未满一岁的小孩,在执行方法之前打印:“ ...

  9. Android ------ 美团的Lint代码检查实践

    概述 Lint是Google提供的Android静态代码检查工具,可以扫描并发现代码中潜在的问题,提醒开发人员及早修正,提高代码质量.除了Android原生提供的几百个Lint规则,还可以开发自定义L ...

随机推荐

  1. Python3之Django连接mysql数据库

    一.mysql服务器 系统版本:CentOS6.8 IP :10.0.0.51 版本 1.授权root远程登录 grant all on *.* to 'root'@'%' identifide by ...

  2. java 反射的意义

    具体的关于反射的介绍可以参考我的另外一篇博文<深入解析java反射>. 反射的意义是什么,其实就是为了代码简洁,提高代码的复用率,外部调用方便,源代码,反编译都能看到. 某些情况下解耦用反 ...

  3. .NET Core环境变量和用户秘钥实现开发中的数据安全

    目录 一.注入 IConfiguration 二.从配置文件 appsettings.json 中获取环境变量 三.从项目中获取环境变量 四.用户秘钥设置环境变量 前言:有很多人将秘钥,数据库连接字符 ...

  4. poj 1270 Following Orders (拓扑排序+回溯)

    Following Orders Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 5473   Accepted: 2239 ...

  5. dev gridcontrol 行号

    /// <summary> /// GridView 显示行号 设置行号列的宽度 /// </summary> /// <param name="gv" ...

  6. js中正则表达式的易错点

    文章目录 1. 匹配符部分匹配规则 2. 分组匹配规则: 3. 注意^的不同用法 4. 不要忘记转义 5. 正则表达式对象中lastIndex属性 6. exec VS match 1. 匹配符部分匹 ...

  7. .Net C# 时间戳时间转换

    闲话不多说,直接上代码 /// <summary> /// 时间拓展 /// </summary> public static class DateTimeExtension ...

  8. Sqlite—删除语句(Delete)

    SQLite 的 DELETE 语句用于删除表中已有的记录.可以使用带有 WHERE 子句的 DELETE 查询来删除选定行,否则所有的记录都会被删除. SQLite 要清空表记录,只能使用Delet ...

  9. 集合系列 Map(十四):WeakedHashMap

    WeakedHashMap 也是 Map 集合的哈希实现,但其余 HashMap 的不同之处在于.其每个节点的 value 引用是弱引用,可以方便 GC 回收. public class WeakHa ...

  10. mac下使用minicom几个注意事项

    一 安装: 安装是比较简单的,直接: brew install minicom 二 查找串口驱动 这里不得不吐槽苹果公司,搞一个串口,从来就不像ubuntu中那样很简洁的名字,这里的名字一般是一长串, ...