Lombok开发指南

发表于 2015-07-30   |   分类于 Programming Notes   |   热度  1819°C   |   暂无评论

Lombok简介

Lombok是一款好用顺手的工具,就像Google Guava一样,在此予以强烈推荐,每一个Java工程师都应该使用它。Lombok是一种Java™实用工具,可用来帮助开发人员消除Java的冗长代码,尤其是对于简单的Java对象(POJO)。它通过注释实现这一目的。通过在开发环境中实现Lombok,开发人员可以节省构建诸如hashCode()equals()这样的方法以及以往用来分类各种accessormutator的大量时间。

Lombok官网地址:https://projectlombok.org/ 里面还提供了一个简短的学习视频。

安装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(NullPointerException)
  • @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;
    }
    

    在IntelliJ中按下Ctrl+F12就可以看到Lombok已经为我们自动生成了一系列的方法。

  • @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;
        }
    }
    

本文地址:http://www.codepub.cn/2015/07/30/Lombok-development-guidelines/
转载请注明出处,谢谢!

Eclipse安装Lombok相关推荐

  1. eclipse安装lombok后无法启动解决办法

    要想在eclipse安装lombok插件,需要将lombok相应的jar下载到eclipse安装目录,网上教程很多,这里不在累赘,按照很多网上的方法安装后eclipse可能会存在无法启动的状况,这里我 ...

  2. 为Eclipse安装lombok插件

    原生的Eclipse没有lombok插件,即使项目引入了lombok依赖也无法正常使用@Data等常用标签.下面介绍一下如何手动为Eclipse添加lombok插件,具体操作步骤如下: (1)打开Do ...

  3. Eclipse 安装 lombok

    1.  下载 lombok.jar https://projectlombok.org/download https://projectlombok.org/downloads/lombok.jar ...

  4. Mac Eclipse安装lombok

    Lombok是一个可以通过注解的形式可以帮助消除一些必须但是显得很臃肿的Java代码的工具,通过使用对应的注解,可以在进行编译源码的时候生成对应的方法,比如类属性的get/set/toString() ...

  5. eclipse 安装 lombok插件

    下载插件 官网下载 :https://projectlombok.org/ 有些小伙伴官网可能打不开,现提供我的下载地址:https://files.cnblogs.com/files/niceyoo ...

  6. eclipse安装lombok插件(小辣椒)

    1.下载lombok.jar,lombok.jar官方下载地址:https://projectlombok.org/download 2.双击下载好的lombak.jar,安装步骤如下: 2-1.关闭 ...

  7. eclipse安装lombok插件 ,但是:lombok注解不起作用(亲测有效!)

    下载完成后在仓库中找到lombok的jar包,拷贝到eclipse的安装文件夹下 再按照第一种方式安装,得到eclipse.ini配置文件中多了 -javaagent:lombok.jar 参考链接: ...

  8. STS安装lombok

    一.问题描述 由于springboot项目中有@Slf4j.@SneakyThrows注解等,而eclipse需要安装lombok插件才能正常编译打印日志:如果不使用注解也可以使用传统的方式打印日志: ...

  9. eclipse插件 - lombok的安装

    lombok的安装: lombok的官方网址:http://projectlombok.org/  使用lombox是需要安装的,如果不安装,IDE则无法解析lombok注解,有两种方式可以安装lom ...

  10. mac eclipse 安装lombok_别再写getter,setter方法了,用Lombok来简化你的代码吧

    前言 在实际开发中,有些代码是重复的.IDE一键生成的,不写不行,写了又觉得代码太臃肿,不美观.如果你也有这种体会,那么,请使用Lombok插件吧,真的非常好用.Lombok的使用也非常简单,都是各种 ...

最新文章

  1. vsphere ha 虚拟机监控错误_学会这3招,分分钟迁移业务繁忙虚拟机!
  2. Android实例-ImageList与Image的应用
  3. boost::test模块测试功能模板测试用例
  4. JOE is on TV! CodeForces - 1293B(数学)
  5. 数据可视化js框架 d3.js入门
  6. NinePatchChunk.java分析
  7. 计算机如何取消自动关机,怎么解除电脑自动关机
  8. oracle instant client 12,Oracle Instant Client_12_1 Downloads
  9. 如何把桌面计算机和回收站隐藏,电脑回收站怎么隐藏图标,隐藏我的电脑和回收站...
  10. windows系统下Redis下载安装与配置(内附蓝奏云下载地址)
  11. Mysql Order By 与 Group By
  12. zjs-my-diary-20200527
  13. 【年终总结】2017年下半年年终总结——试着将一切归零,整装再出发
  14. Win10右键文件夹卡死如何处理
  15. html星座代码,各星座详细页面.html
  16. EasyExcel基本操作看这一篇文章就够了
  17. 二、Linux镜像软件的安装
  18. 2,未来十年,资产增加
  19. linux mkdir命令用法,linux里面的mkdir命令
  20. (趋势)The 2002 Trend Micro Programming Contest, Preliminary

热门文章

  1. Python 各种库下载地址介绍
  2. Win7无法正常使用TTS语音的解决办法
  3. 通过一个最简单的程序入门Windows编程
  4. Ubuntu MPEG-4 AAC 与 H.264 解码器安装
  5. windows下使用iconv命令批量原地转码文件
  6. 多变量遗传算法python代码_遗传算法介绍并附上Python代码
  7. 计算机网络安全基础-网络监听基本概念
  8. 如何快速获取CSDN积分
  9. mapxtreme相关
  10. QT调用OpenCV