装在地址: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 是一个 Java 开发工具,它能帮助开发者消除Java Bean 类中的冗余代码,如 getter, setter, 构造函数等。Lombok 提供了注解,通过在类或属性上添加这些注解,编译器会在编译时自动插入相应的代码。 描述中...
针对"lombok-resource.rar"这个压缩包,我们可以推断它包含了Lombok插件的离线安装包和一份详细的安装指南,确保在IDEA(可能是2019.1或2019.3版本)中100%成功安装Lombok。以下将详细介绍Lombok的核心概念和如何...
4. **许可证和文档**:可能包含STS和Lombok的使用许可协议以及相关的用户指南和API文档。 5. **可能的更新和修复程序**:可能包含STS的一些更新和补丁,以确保其稳定性与兼容性。 使用这个压缩包,开发者可以快速...
本压缩包文件"lombok plugin配置.zip"提供了一种在IntelliJ IDEA中配置Lombok插件的详细指南,包括手动配置步骤和插件下载方法。 首先,了解Lombok的基本概念是必要的。Lombok提供了诸如`@Data`, `@Setter`, `@...
这个文件很可能是Lombok的详细使用指南,包含了如何配置项目以使用Lombok,以及各个注解的详细解释和示例代码。通过阅读这份说明,开发者可以更好地理解Lombok的功能,避免误用,提高代码质量。 4. **集成与配置**...
Lombok 是一个强大的 Java 开发工具,它通过注解的方式帮助开发者简化代码,避免编写大量重复的样板代码,如 getter、setter、equals、hashCode、构造函数等。Lombok 不依赖于运行时反射,而是在编译阶段就自动生成...
在IDEA(IntelliJ IDEA)中使用Lombok,可以提高开发效率,使得代码更加整洁。本文将详细介绍如何在IDEA 2018版本上手动安装Lombok插件,以及压缩包中的内容。 首先,我们需要理解Lombok的基本概念。Lombok提供了一...
Lombok 是一个非常受欢迎的 Java 开发工具,它通过注解的方式简化了 Java 类的编写工作,例如自动处理 getter、setter、构造函数等。Lombok 插件则是将其功能集成到 IDE 中,使得开发人员在编写代码时可以享受到 ...
《 IntelliJ IDEA 2018.1 中使用 Lombok 0.17 插件的指南》 在软件开发过程中,提升效率是每个开发者追求的目标。Lombok 是一个 Java 库,它通过注解的方式帮助我们自动处理getter、setter、构造函数等冗余代码,...
保持构建工具和Lombok的版本同步,以及遵循官方的更新指南,可以避免很多这类问题。 5. **使用Lombok的注意事项**: 虽然Lombok大大简化了代码,但也可能带来一些潜在问题。例如,由于代码生成是在编译时完成的,...
Lombok 是一个 Java 开发工具,它通过注解处理器在编译时自动插入代码,从而减少了手动编写样板代码的需求。Lombok 插件是用于集成 Lombok 功能到开发环境中的工具,使得开发者可以在 IntelliJ IDEA(简称 IDEA)...
压缩包中的“lombok包+sts使用文档”应该包含了详细的步骤指南,涵盖了如何安装Lombok插件、配置STS以支持Lombok,以及如何在实际项目中应用Lombok注解。阅读这份文档将有助于理解Lombok和STS的集成使用,并提升...
1. **说明.txt**:这通常是一个包含安装指南或插件使用说明的文本文件,为用户提供了如何正确安装和配置 Lombok 插件的步骤。 2. **lombok-plugin-0.27-2019.1**:这是一个 jar 文件,它是 Lombok 插件的核心组件。...
然后按照官方指南更新项目中的Lombok依赖,确保IDE插件也匹配新版本。 总之,Lombok是Java开发中的一个强大工具,能够极大地减少样板代码,使代码更加简洁易读。通过合理使用Lombok的注解,开发者可以更专注于业务...
本指南将详细解析IntelliJ IDEA的开发配置,帮助你充分利用其功能,提高开发效率。 一、安装与启动 首先,你需要从官方网站下载对应操作系统的IntelliJ IDEA安装包,按照提示进行安装。安装完成后,双击图标启动...
Lombok快速上手指南 Lombok是一个Java库,旨在减少 Java 开发中的样板代码,通过自动生成 getter、setter、toString、equals、hashCode 等方法,提高开发效率。本文将详细介绍 Lombok 的安装、使用和注解参数。 一...
IDEA拥有丰富的插件生态,可以通过插件市场安装各种功能,如Docker支持、Lombok支持、REST Client等,以满足不同开发需求。 八、代码质量检查 内置的Inspections工具能够对代码进行静态分析,发现潜在问题并提供...
3. **文档**:可能包括Lombok的使用指南、Spring框架与Lombok结合的教程,以及关于如何在分布式项目中配置和使用这些插件的说明。 4. **配置文件**:可能包含了插件的默认配置,帮助快速设置开发环境。 5. **依赖库*...
Java 8作为开发语言的基础,Lombok能够简化实体类等的代码编写,SpringMVC用于处理Web请求,Swagger帮助开发者设计、构建、记录和使用RESTful Web服务。Mybatis是流行的持久层框架,Mybatis-Plus是其增强工具。 ...
- 插件市场:Android Studio拥有丰富的插件库,可扩展功能,如Lombok、Android Lint等。 - AS插件开发:了解如何为Android Studio开发自定义插件,提升开发效率。 12. **持续集成与部署** - Jenkins、Travis CI...