装在地址:http://codepub.cn/2015/07/30/Lombok-development-guidelines/
Lombok简介
Lombok
是一款好用顺手的工具,就像Google Guava
一样,在此予以强烈推荐,每一个Java工程师都应该使用它。Lombok是一种Java™实用工具,可用来帮助开发人员消除Java的冗长代码,尤其是对于简单的Java对象(POJO)。它通过注释实现这一目的。通过在开发环境中实现Lombok,开发人员可以节省构建诸如hashCode()
和equals()
这样的方法以及以往用来分类各种accessor
和mutator
的大量时间。
Lombok官网地址:https://projectlombok.org/ 里面还提供了一个简短的学习视频。
安装Lombok
Eclipse安装Lombok
双击Jar安装
首先下载Jar包,下载地址:http://projectlombok.org/download.html
注意如果eclipse没有安装到默认目录,那么需要点击Specify选择eclipse.exe所在的路径,然后Install即可完成安装。
在新建项目之后,使用Lombok如果程序还报错,那么点击eclipse菜单的Project选项的clean,清理一下即可。
Eclipse手动安装Lombok步骤
- 将lombok.jar复制到myeclipse.ini/eclipse.ini所在的文件夹目录下
- 打开eclipse.ini/myeclipse.ini,在最后面插入以下两行并保存:
-Xbootclasspath/a:lombok.jar
-javaagent:lombok.jar - 重启eclipse/myeclipse
最后需要注意的是,在使用lombok
注解的时候记得要导入lombok.jar
包到工程,如果使用的是Maven Project
,要在pom.xml
中添加依赖,并设置Maven
为自动导入,参见IntelliJ部分。
1 2 3 4 5 |
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.8</version> </dependency> |
IntelliJ安装Lombok
通过IntelliJ的插件中心安装
注意一点,在IntelliJ中如果创建的是Maven项目,那么在pom.xml文件中添加依赖后,需要设置Maven为自动导入。
IntelliJ手动安装Lombok
如果不想通过IntelliJ的插件中心安装的话,也可以手动安装,详细步骤参见Github上的说明:https://github.com/mplushnikov/lombok-intellij-plugin
简单点说手动安装步骤如下:
Download the latest release and install it manually using Preferences > Plugins > Install plugin from disk…
Lombok用法
Lombok注解说明
-
val
:用在局部变量前面,相当于将变量声明为final -
@NonNull
:给方法参数增加这个注解会自动在方法内对该参数进行是否为空的校验,如果为空,则抛出NPE -
@Cleanup
:自动管理资源,用在局部变量之前,在当前变量范围内即将执行完毕退出之前会自动清理资源,自动生成try-finally这样的代码来关闭流 -
@Getter / @Setter
:用在属性上,再也不用自己手写setter和getter方法了,还可以指定访问范围 -
@ToString
:用在类上,可以自动覆写toString方法,当然还可以加其他参数,例如@ToString(exclude=”id”)排除id属性,或者@ToString(callSuper=true, includeFieldNames=true)调用父类的toString方法,包含所有属性 -
@EqualsAndHashCode
:用在类上,自动生成equals方法和hashCode方法 -
@NoArgsConstructor, @RequiredArgsConstructor and @AllArgsConstructor
:用在类上,自动生成无参构造和使用所有参数的构造函数以及把所有@NonNull属性作为参数的构造函数,如果指定staticName = “of”参数,同时还会生成一个返回类对象的静态工厂方法,比使用构造函数方便很多 -
@Data
:注解在类上,相当于同时使用了@ToString
、@EqualsAndHashCode
、@Getter
、@Setter
和@RequiredArgsConstrutor
这些注解,对于POJO类
十分有用 -
@Value
:用在类上,是@Data的不可变形式,相当于为属性添加final声明,只提供getter方法,而不提供setter方法 -
@Builder
:用在类、构造器、方法上,为你提供复杂的builder APIs,让你可以像如下方式一样调用Person.builder().name(“Adam Savage”).city(“San Francisco”).job(“Mythbusters”).job(“Unchained Reaction”).build();更多说明参考Builder -
@SneakyThrows
:自动抛受检异常,而无需显式在方法上使用throws语句 -
@Synchronized
:用在方法上,将方法声明为同步的,并自动加锁,而锁对象是一个私有的属性lock或LOCK,而java中的synchronized关键字锁对象是this,锁在this或者自己的类对象上存在副作用,就是你不能阻止非受控代码去锁this或者类对象,这可能会导致竞争条件或者其它线程错误 -
@Getter(lazy=true)
:可以替代经典的Double Check Lock样板代码 -
@Log
:根据不同的注解生成不同类型的log对象,但是实例名称都是log,有六种可选实现类-
@CommonsLog
Creates log = org.apache.commons.logging.LogFactory.getLog(LogExample.class); -
@Log
Creates log = java.util.logging.Logger.getLogger(LogExample.class.getName()); -
@Log4j
Creates log = org.apache.log4j.Logger.getLogger(LogExample.class); -
@Log4j2
Creates log = org.apache.logging.log4j.LogManager.getLogger(LogExample.class); -
@Slf4j
Creates log = org.slf4j.LoggerFactory.getLogger(LogExample.class); -
@XSlf4j
Creates log = org.slf4j.ext.XLoggerFactory.getXLogger(LogExample.class);
-
Lombok使用示例
-
val示例
1 2 3 4 5 6 7 8 9
public static void main(String[] args) { val sets = new HashSet<String>(); val lists = new ArrayList<String>(); val maps = new HashMap<String, String>(); //=>相当于如下 final Set<String> sets2 = new HashSet<>(); final List<String> lists2 = new ArrayList<>(); final Map<String, String> maps2 = new HashMap<>(); }
-
@NonNull示例
1 2 3 4 5 6 7 8 9 10 11
public void notNullExample(@NonNull String string) { string.length(); } //=>相当于 public void notNullExample(String string) { if (string != null) { string.length(); } else { throw new NullPointerException("null"); } }
-
@Cleanup示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
public static void main(String[] args) { try { @Cleanup InputStream inputStream = new FileInputStream(args[0]); } catch (FileNotFoundException e) { e.printStackTrace(); } //=>相当于 InputStream inputStream = null; try { inputStream = new FileInputStream(args[0]); } catch (FileNotFoundException e) { e.printStackTrace(); } finally { if (inputStream != null) { try { inputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } }
-
@Getter / @Setter示例
1 2 3 4
@Setter(AccessLevel.PUBLIC) @Getter(AccessLevel.PROTECTED) private int id; private String shap;
-
@ToString示例
1 2 3 4 5 6 7 8 9 10 11
@ToString(exclude = "id", callSuper = true, includeFieldNames = true) public class LombokDemo { private int id; private String name; private int age; public static void main(String[] args) { //输出LombokDemo(super=LombokDemo@48524010, name=null, age=0) System.out.println(new LombokDemo()); } }
-
@EqualsAndHashCode示例
1 2 3 4 5
@EqualsAndHashCode(exclude = {"id", "shape"}, callSuper = false) public class LombokDemo { private int id; private String shap; }
-
@NoArgsConstructor, @RequiredArgsConstructor and @AllArgsConstructor示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
@NoArgsConstructor @RequiredArgsConstructor(staticName = "of") @AllArgsConstructor public class LombokDemo { @NonNull private int id; @NonNull private String shap; private int age; public static void main(String[] args) { new LombokDemo(1, "circle"); //使用静态工厂方法 LombokDemo.of(2, "circle"); //无参构造 new LombokDemo(); //包含所有参数 new LombokDemo(1, "circle", 2); } }
-
@Data示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
import lombok.Data; @Data public class Menu { private String shopId; private String skuMenuId; private String skuName; private String normalizeSkuName; private String dishMenuId; private String dishName; private String dishNum; //默认阈值 private float thresHold = 0; //新阈值 private float newThresHold = 0; //总得分 private float totalScore = 0; }
-
@Value示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14
@Value public class LombokDemo { @NonNull private int id; @NonNull private String shap; private int age; //相当于 private final int id; public int getId() { return this.id; } ... }
-
@Builder示例
1 2 3 4 5 6 7 8 9 10
@Builder public class BuilderExample { private String name; private int age; @Singular private Set<String> occupations; public static void main(String[] args) { BuilderExample test = BuilderExample.builder().age(11).name("test").build(); } }
-
@SneakyThrows示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
import lombok.SneakyThrows; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStream; import java.io.UnsupportedEncodingException; public class Test { @SneakyThrows() public void read() { InputStream inputStream = new FileInputStream(""); } @SneakyThrows public void write() { throw new UnsupportedEncodingException(); } //相当于 public void read() throws FileNotFoundException { InputStream inputStream = new FileInputStream(""); } public void write() throws UnsupportedEncodingException { throw new UnsupportedEncodingException(); } }
-
@Synchronized示例
1 2 3 4 5 6 7 8 9 10 11 12 13
public class SynchronizedDemo { @Synchronized public static void hello() { System.out.println("world"); } //相当于 private static final Object $LOCK = new Object[0]; public static void hello() { synchronized ($LOCK) { System.out.println("world"); } } }
-
@Getter(lazy = true)
1 2 3 4 5 6 7 8 9 10 11
public class GetterLazyExample { @Getter(lazy = true) private final double[] cached = expensive(); private double[] expensive() { double[] result = new double[1000000]; for (int i = 0; i < result.length; i++) { result[i] = Math.asin(i); } return result; } }
相当于如下所示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
import java.util.concurrent.atomic.AtomicReference; public class GetterLazyExample { private final AtomicReference<java.lang.Object> cached = new AtomicReference<>(); public double[] getCached() { java.lang.Object value = this.cached.get(); if (value == null) { synchronized (this.cached) { value = this.cached.get(); if (value == null) { final double[] actualValue = expensive(); value = actualValue == null ? this.cached : actualValue; this.cached.set(value); } } } return (double[]) (value == this.cached ? null : value); } private double[] expensive() { double[] result = new double[1000000]; for (int i = 0; i < result.length; i++) { result[i] = Math.asin(i); } return result; } }
相关推荐
lombok.jar lombok.jar lombok.jar lombok.jar 亲测好用!!!
lombok 1.18.24 lombok 1.18.24 lombok 1.18.24 lombok 1.18.24 lombok 1.18.24 lombok 1.18.24 lombok 1.18.24 lombok 1.18.24 lombok 1.18.24 lombok 1.18.24 lombok 1.18.24 lombok 1.18.24 lombok 1.18.24 ...
lombok
赠送jar包:lombok-1.16.20.jar; 赠送原API文档:lombok-1.16.20-javadoc.jar; 赠送源代码:lombok-1.16.20-sources.jar; 赠送Maven依赖信息文件:lombok-1.16.20.pom; 包含翻译后的API文档:lombok-1.16.20-...
lombok_lombok.zip
Lombok 是一种 Java 实用工具,可用来帮助开发人员消除 Java 的冗长,尤其是对于简单的 Java 对象(POJO)。它通过注释实现这一目的。通过在开发环境中实现 Lombok,开发人员可以节省构建诸如 hashCode() 和 equals...
lombok(1.16.18版本)最新包, 1、下载Lombok.jar 2、双击运行Lombok.jar 数秒后将弹出一框,以确认eclipse的安装路径 3、确认完eclipse的安装路径后,点击install/update按钮,即可安装完成 4、安装完成之后,请...
lombok_lombok_源码.zip
lombok 1.18.24
eclipse安装lombok支持的jar包,一键安装,简单轻松可用
Lombok能以简单的注解形式来简化java代码,提高开发人员的开发效率。例如开发中经常需要写的javabean,都需要花时间去添加相应的getter/setter,也许还要去写构造器、equals等方法,而且需要维护,当属性多时会出现...
lombok 1.18.16,2020.11.9 从官网下载的:https://projectlombok.org/download
Lombok安装及使用,里面包含文档说明及jar包,安装步骤、例子都在里面,欢迎使用
赠送jar包:lombok-1.16.10.jar; 赠送原API文档:lombok-1.16.10-javadoc.jar; 赠送源代码:lombok-1.16.10-sources.jar; 赠送Maven依赖信息文件:lombok-1.16.10.pom; 包含翻译后的API文档:lombok-1.16.10-...
lombok插件,-IDE安装Lombok插件提高开发效率。java开发插件。
IDEA lombok 插件 get set方法可以提示
开发:现在可以在JDK1.9上编译lombok。 修正:如果生成的hashCode会破坏合约callSuper=true,of={}。问题#1505 修正:delombok不再打印合成的外部类参数。问题#1521 BUGFIX:@Builder.Default现在也适用于存在类型...
将lombok.jar文件,放到eclipse安装路径,该jar包也就是lombok插件的jar文件了 打开eclipse.ini文件,添加如下内容: -javaagent:lombok.jar -Xbootclasspath/a:lombok.jar 重启eclipse
下载Lombok,版本为Lombok1.18.6.jar(因jdk1.8与1.16.x版本不匹配,所以才升级1.18.x版本) 安装方法: 将Lombok1.18.6.jar复制到eclipse安装目录下之后鼠标双击它,然后点击弹窗页面的Specify location按钮之后...
IDEA lombok 插件 lombok-plugin-0.8.8-14