美文网首页程序员
优雅编程 - Lombok

优雅编程 - Lombok

作者: 林昀熙 | 来源:发表于2019-12-20 07:41 被阅读0次

Lombok可以做到对已有Java代码在字节码层级的改变,它的目的在于让程序员少写一些“样板代码”;所谓样板代码是那些没有营养,却又不得不写的代码;像实体中定义的getter、setter、equals、hashcode、toString等方法).

Intelli IDEA安装Lombok插件

1.【Intelli IDEA】- 【Preferences】-【plugins】

  1. 搜索lombok,点击install.

Lombok常用注解

  • @Getter/ @Setter:
    注解在属性上;为属性提供 getting 和 setting 方法

  • @ToString:
    实现toString()方法

  • @EqualsAndHashCode:
    实现equals()方法和hashCode()方法

  • @Data :
    注解在类上;提供类所有属性的 getting 和 setting 方法,此外还提供了equals、canEqual、hashCode、toString 方法

  • @Log4j :
    注解在类上;为类提供一个 属性名为log 的 log4j 日志对象

  • @NoArgsConstructor:
    注解在类上;为类提供一个无参的构造方法

  • @AllArgsConstructor:
    注解在类上;为类提供一个全参的构造方法

  • @Builder:
    注解在类上:实现一种Builder Patterns(生成器模式)的功能

  • @SneakyThrows:
    注解到方法上:可以实现在try...catch到异常后进行的throw操作

  • @Synchronized:
    注解到方法上:实现同步代码片段的功能

更多注解说明: 官方文档

Lombok使用

常用的模板代码注解化示例

@Setter
@Getter
@ToString
@EqualsAndHashCode
@Builder
@NoArgsConstructor
@AllArgsConstructor
class BasicModel implements Serializable{

    private Long id;
    private String title;
    private Double score;
    private Date createTime;

    public static void main(String[] args) {

        Date now = new Date();

        // 通用模式构建对象
        BasicModel bm1 = new BasicModel();
        bm1.setCreateTime(now);
        bm1.setId(1L);
        bm1.setScore(11D);
        bm1.setTitle("Lombok示例1");

        // Builder模式构建对象
        BasicModel bm2 = BasicModel.builder()
                .id(1L).score(11D).title("Lombok示例1").createTime(now)
                .build();

        // 全参构造
        // 需要注意的是Lombok提供的全参构造是依赖属性在对象中定义顺序的,
        BasicModel bm3 = new BasicModel(2L, "Lombok示例1", 11D, now);

        // toString使用
        System.out.println("bm1 = " + bm1);
        System.out.println("bm2 = " + bm2);
        System.out.println("bm3 = " + bm3);

        // equals()使用
        System.out.println("bm1.equals(bm2) = " + bm1.equals(bm2));
        System.out.println("bm1.equals(bm3) = " + bm1.equals(bm3));

    }
}

示例执行结果

bm1 = BasicModel(id=1, title=Lombok示例1, score=11.0, createTime=Sun Nov 27 17:14:17 CST 2016)
bm2 = BasicModel(id=1, title=Lombok示例1, score=11.0, createTime=Sun Nov 27 17:14:17 CST 2016)
bm3 = BasicModel(id=2, title=Lombok示例1, score=11.0, createTime=Sun Nov 27 17:14:17 CST 2016)
bm1.equals(bm2) = true
bm1.equals(bm3) = false

上面的注解可以简化为如下

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
class BasicModel implements Serializable{

    private Long id;
    private String title;
    private Double score;
    private Date createTime;
}

Lombok问题方案

问题: 父子类集成关系中中全参构造, 以及Builder模式构建对象时,父类属性不可见。
方案:

@Data
@NoArgsConstructor
@AllArgsConstructor
class BasicModel implements Serializable{

    private Long id;
    private String title;
    private Double score;
    private Date createTime;
}


@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString(callSuper = true)
class ArticleModel extends BasicModel{

    private String author;
    private String images;

    // 增减该构造方案, 此时子类中有三个构造,@NoArgsConstructor、@AllArgsConstructor、当前构造
    @Builder
    public ArticleModel(Long id, String title, Double score, Date createTime,
                        String author, String images) {
        super(id, title, score, createTime);
        this.author = author;
        this.images = images;
    }

    public static void main(String[] args) {

        Date now = new Date();

        // Builder模式构建对象
        ArticleModel am1 = ArticleModel.builder()
                .id(1L).score(11D).title("Lombok示例1").createTime(now)
                .author("Elon.su").images("图片地址")
                .build();

        // 常见的模板对象创建
        ArticleModel am2 = new ArticleModel("Elon.su", "图片地址");
        am2.setId(1L);
        am2.setTitle("Lombok示例1");
        am2.setCreateTime(now);

        // toString使用
        System.out.println("am1 = " + am1);
        System.out.println("am2 = " + am2);

        // equals()使用
        System.out.println("am1.equals(am2) = " + am1.equals(am2));
    }
}

示例执行结果

am1 = ArticleModel(super=BasicModel(id=1, title=Lombok示例1, score=11.0, createTime=Sun Nov 27 17:41:53 CST 2016), author=Elon.su, images=图片地址)
am2 = ArticleModel(super=BasicModel(id=1, title=Lombok示例1, score=null, createTime=Sun Nov 27 17:41:53 CST 2016), author=Elon.su, images=图片地址)
am1.equals(am2) = true

相关文章

  • 优雅编程 - Lombok

    Lombok可以做到对已有Java代码在字节码层级的改变,它的目的在于让程序员少写一些“样板代码”;所谓样板代码是...

  • lombok 插件使用技巧

    lombok @EqualsAndHashCode 注解的影响 Java中优雅的使用Lombok

  • lombok快速入门

    1、简介 为了提高代码优雅,引入了Lombok(lombok.*包) lombok 官网:https://proj...

  • 优雅的JAVA工具库LOMBOK

    优雅的Java工具库Lombok 最近在公司的项目中看到了对于Lombok的应用,通过@Data注解标注POJO,...

  • Lombok:让JAVA代码更优雅

    Lombok:让JAVA代码更优雅关于Lombok,其实在网上可以找到很多如何使用的文章,但是很少能找到比较齐全的...

  • Eclipse、STS安装lombok插件

    项目中使用了lombok来简化编程,如果不在开发环境中安装lombok插件,编写代码过程中会有各种红色叉叉错误提示...

  • 《一步一步学优雅编程》目录

    优雅编程之这样注释代码,你就“正常”了(一) 优雅编程之这样写函数,你就“正常”了(二) 优雅编程之做1个“正常”...

  • MyBatis之使用注解开发

    六、使用注解开发 目录:面向接口编程、使用注解开发、CRUD、Lombok 1.面向接口编程 之前都学过面向对象编...

  • Lombok实现链式编程

    一个注解: 或

  • Springboot2.0的优雅

    Springboot2.0的优雅 Lombok的其他用法 拦截器 拦截器,在AOP(Aspect-Oriented...

网友评论

    本文标题:优雅编程 - Lombok

    本文链接:https://www.haomeiwen.com/subject/yptvnctx.html