`
1028826685
  • 浏览: 921496 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类

Lombok开发指南

 
阅读更多
装在地址:http://codepub.cn/2015/07/30/Lombok-development-guidelines/

Lombok简介

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

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:用在方法上,将方法声明为同步的,并自动加锁,而锁对象是一个私有的属性lockLOCK,而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;
        }
    }
分享到:
评论

相关推荐

    lombok.jar;lombok.jar

    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 1.18.24 ...

    eclipse的lombok驱动包

    lombok

    lombok-1.16.20-API文档-中文版.zip

    赠送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_lombok.zip

    lombok包 lombok.jar

    Lombok 是一种 Java 实用工具,可用来帮助开发人员消除 Java 的冗长,尤其是对于简单的 Java 对象(POJO)。它通过注释实现这一目的。通过在开发环境中实现 Lombok,开发人员可以节省构建诸如 hashCode() 和 equals...

    lombok.jar(1.16.18版本)最新包

    lombok(1.16.18版本)最新包, 1、下载Lombok.jar 2、双击运行Lombok.jar 数秒后将弹出一框,以确认eclipse的安装路径 3、确认完eclipse的安装路径后,点击install/update按钮,即可安装完成 4、安装完成之后,请...

    lombok_lombok_源码.zip

    lombok_lombok_源码.zip

    lombok 1.18.24

    lombok 1.18.24

    lombok的eclipse安装包

    eclipse安装lombok支持的jar包,一键安装,简单轻松可用

    lombok-plugin-0.28-2018.2.zip

    Lombok能以简单的注解形式来简化java代码,提高开发人员的开发效率。例如开发中经常需要写的javabean,都需要花时间去添加相应的getter/setter,也许还要去写构造器、equals等方法,而且需要维护,当属性多时会出现...

    lombok 1.18.16

    lombok 1.18.16,2020.11.9 从官网下载的:https://projectlombok.org/download

    Lombok安装及使用

    Lombok安装及使用,里面包含文档说明及jar包,安装步骤、例子都在里面,欢迎使用

    lombok-1.16.10-API文档-中文版.zip

    赠送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插件

    lombok插件,-IDE安装Lombok插件提高开发效率。java开发插件。

    IDEA lombok 插件安装下载

    IDEA lombok 插件 get set方法可以提示

    lombok1.16.20

    开发:现在可以在JDK1.9上编译lombok。 修正:如果生成的hashCode会破坏合约callSuper=true,of={}。问题#1505 修正:delombok不再打印合成的外部类参数。问题#1521 BUGFIX:@Builder.Default现在也适用于存在类型...

    lombok.jar lombok.jar

    将lombok.jar文件,放到eclipse安装路径,该jar包也就是lombok插件的jar文件了  打开eclipse.ini文件,添加如下内容:  -javaagent:lombok.jar  -Xbootclasspath/a:lombok.jar 重启eclipse

    lombok-1.18.6-source.zip

    下载Lombok,版本为Lombok1.18.6.jar(因jdk1.8与1.16.x版本不匹配,所以才升级1.18.x版本) 安装方法: 将Lombok1.18.6.jar复制到eclipse安装目录下之后鼠标双击它,然后点击弹窗页面的Specify location按钮之后...

    IDEA lombok 插件

    IDEA lombok 插件 lombok-plugin-0.8.8-14

Global site tag (gtag.js) - Google Analytics