Lombok插件的简介「建议收藏」

Lombok插件的简介「建议收藏」Lombok插件的简介1Lombok引入2Lombok常见注解使用1@Data2@AllArgsConstructor3@NoArgsConstructor4@ToString5@EqualsAndHashCode6@Getter/@Setter7@Slf4j8@NonNull9@Value10@Builder11@Synchronized12@SneakyThrows13@Cleanup3Lombok原理4关于Lombok总结官网:https://projectlom

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

官网: https://projectlombok.org/

官方文档: https://projectlombok.org/api/lombok/package-summary.html

参考资料:

https://www.jianshu.com/p/2543c71a8e45

https://blog.csdn.net/zhaoyanjun6/article/details/80743302

1 Lombok引入

未使用lombok的Java的Bean:

public class DepartMent { 
   

    private String name;

    public DepartMent() { 
   
    }

    public DepartMent(String name) { 
   
        this.name = name;
    }

    public String getName() { 
   
        return name;
    }

    public void setName(String name) { 
   
        this.name = name;
    }

    @Override
    public boolean equals(Object o) { 
   
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        DepartMent that = (DepartMent) o;
        return Objects.equals(name, that.name);
    }

    @Override
    public int hashCode() { 
   
        return Objects.hash(name);
    }

    @Override
    public String toString() { 
   
        return "DepartMent{" +
                "name='" + name + '\'' +
                '}';
    }
}

使用lombok的Java的Bean:

@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
@EqualsAndHashCode
public class DepartMent { 
   
    private String name;
}  

总结:

lombok的出现,是为了简化Java的Bean对象,将大量重复,没有技术意义的代码省略,不仅能使代码整洁美观,还能人们将注意力放到更重要的业务代码中.

使用前准备:

1 在IDEA中plugins中安装Lombok插件,重启IDEA.

image-20210406213944545

2 添加lombok坐标

                <dependency>
                    <groupId>org.projectlombok</groupId>
                    <artifactId>lombok</artifactId>
                    <version>1.18.16</version>
                </dependency>

2 Lombok常见注解使用

1 @Data

@Data注解,自动生成对象属性的getter方法,setter方法,equals方法,hashCode方法,toString方法,无参构造方法.

厉害的童鞋提醒滴

@Data
public class DepartMent { 
   
    private String name;
}  

等同于:

public class DepartMent { 
   
    private String name;
    
 	public DepartMent() { 
   }
    
    public String getName() { 
   
        return name;
    }

    public void setName(String name) { 
   
        this.name = name;
    }
    @Override
    public boolean equals(Object o) { 
   
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        DepartMent that = (DepartMent) o;
        return Objects.equals(name, that.name);
    }

    @Override
    public int hashCode() { 
   
        return Objects.hash(name);
    }
}

2 @AllArgsConstructor

@AllArgsConstructor注解, 对象的全参数构造

@NoArgsConstructor
public class DepartMent { 
   
    private String name;
}  

等同于:

public class DepartMent { 
   
    private String name;

    public DepartMent(String name) { 
   
        this.name = name;
    }

}

3 @NoArgsConstructor

@NoArgsConstructor注解,对象的无参构造

@NoArgsConstructor
public class DepartMent { 
   
    private String name;
}  

等同于:

public class DepartMent { 
   
    private String name;

    public DepartMent() { 
   }

}

4 @ToString

@ToString注解,对象的toString方法

@ToString
public class DepartMent { 
   
    private String name;
}  

等同于:

public class DepartMent { 
   
    private String name;
    
    @Override
    public String toString() { 
   
        return "DepartMent{" +
                "name='" + name + '\'' +
                '}';
    }
}  

5 @EqualsAndHashCode

@EqualsAndHashCode注解,对象的equals和hashcode方法.

@EqualsAndHashCode
public class DepartMent { 
   
    private String name;
}  

等同于:

public class DepartMent { 
   
    private String name;
    
    @Override
    public boolean equals(Object o) { 
   
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        DepartMent that = (DepartMent) o;
        return Objects.equals(name, that.name);
    }

    @Override
    public int hashCode() { 
   
        return Objects.hash(name);
    }
} 

6 @Getter/@Setter

@Getter/@Setter注解,对象的get/set方法

@Getter
@Setter  
public class DepartMent { 
   
    private String name;
} 

等同于:

public class DepartMent { 
   
    private String name;
    
    public String getName() { 
   
        return name;
    }

    public void setName(String name) { 
   
        this.name = name;
    }
}

7 @Slf4j

@Slf4j注解,日志打印,相当于public static final Logger log = LoggerFactory.getLogger(类名.class);

@Slf4j 
public class DepartMent { 
   
    private String name;
    
  public static void main(String[] args) { 
   
        log.info("日志: {}" + "Hello World!");
    }
} 

等同于:

public class DepartMent { 
   
    private String name;
    
    public static final Logger log = LoggerFactory.getLogger(DepartMent.class);
    
    public static void main(String[] args) { 
   
        log.info("日志: {}" + "Hello World!");
    }
} 

8 @NonNull

@NonNull注解, 对象的成员变量和参数,标识不能为空,否则抛出空指针异常.

public class DepartMent { 
   
    @NonNull
    private String name;
    
    public String getName() { 
   
        return name;
    }

    public void setName(@NonNull String name) { 
   
        this.name = name;
    }
} 

9 @Value

@Value注解, 把对象为final类,把成员变量默认定义private final,且不生成set方法.

@Value
public class DepartMent { 
   
    private String name;
} 

等同于:

public final class DepartMent { 
   
    private final String name;
} 

10 @Builder

@Builder注解, 给类添加构造者模式

@Builder
public class DepartMent { 
   
    private String name;
} 

等同于:

public class DepartMent { 
   
  
   private String name;
    
   DepartMent(String name) { 
   
        this.name = name;
    }
   public static DepartMent.DepartMentBuilder builder() { 
   
        return new DepartMent.DepartMentBuilder();
    }
    
     public static class DepartMentBuilder { 
   
   	 	private String name;
         DepartMentBuilder(){ 
   };
         
         public DepartMent.DepartMentBuilder name(String name) { 
   
            this.name = name;
            return this;
        }
         
         public DepartMent build() { 
   
            return new DepartMent(this.name);
        }
         public String toString() { 
   
            return "DepartMent.DepartMentBuilder( name=" + this.name +")";
        }
   }

} 

11 @Synchronized

@Synchronized注解,加一个同步锁

public class DepartMent { 
   
   
    private String name;
    
    //普通方法,相当于对象锁
    @Synchronized
    void before() { 
   
       //代码逻辑
    }
    
    //静态方法,相当于类锁
    @Synchronized
    static void after() { 
   
       //代码逻辑
    }   

} 

等同于:

public class DepartMent { 
   
    private final Object $lock = new Object[0];
    private static final Object $LOCK = new Object[0];
    private String name;
    

    void before() { 
   
        Object var1 = this.$lock;
        synchronized(this.$lock) { 
   
             //代码逻辑
        }
    }
    
    static void after() { 
   
	    Object var0 = $LOCK;
        synchronized($LOCK) { 
   
             //代码逻辑
        }
     
    }   

} 

12 @SneakyThrows

@SneakyThrows注解, 等同于try/catch 捕获异常.

public class DepartMent { 
   
    private String name;
    
    @SneakyThrows
    public void init(){ 
   
        int a = 1 / 0;
    }
} 

等同于:

public class DepartMent { 
   
    private String name;
    
    public void init(){ 
   
        try{ 
   
        int a = 1 / 0;
        }catch(Exception e){ 
   
            //处理
        }
    }
} 

13 @Cleanup

@Cleanup注解,自动关闭资源,例如IO流对象.

public class DepartMent { 
   
    private String name;
    
    public void init(){ 
   
       @Cleanup InputStream in = new InputStream(); 
    }
}

等同于:

public class DepartMent { 
   
    private String name;
    
    public void init(){ 
   
        try{ 
             
       		InputStream in = new InputStream();  
        }finally{ 
   
            in.close();
    }
}

14 @Accessors

@Accessors注解,存取器,控制getter和setter方法的形式.注解有三个属性.
fluent
fluent默认为false,如果为true,则getter和setter方法的方法名都是属性名(如下name),且setter方法返回当前对象.(如下DepartMent )

@Data
@Accessors(fluent = true)
public class DepartMent { 
   
    private String name;
    
     public String name() { 
   
        return name;
    }

    public DepartMent name(String name) { 
   
       //Xxx
    }   
}

chain
chain默认为false,如果为true,setter方法返回当前对象.(如下DepartMent )

@Data
@Accessors(chain = true)
public class DepartMent { 
   
    private String name;
    
     public String getName() { 
   
        return name;
    }

    public DepartMent setName(String name) { 
   
       //Xxx
    }   
}

prefix
prefix默认为空的字符数组.可自定义前缀.(如下f),getter和setter方法会忽视属性名前的前缀.(剩下按照驼峰命名规则)

@Data
@Accessors(prefix = "f")
public class DepartMent { 
   
    private String fname;
    
     public String name() { 
   
        return name;
    }

    public void name(String name) { 
   
       //Xxx
    }   
}

3 Lombok原理

jdk1.6,javac支持JSR 269 Pluggable Annotation Processing API规范,程序实现该规范,在javac运行时,就可以调用.

Lombok就是实现了该规范的程序.在javac过程中的工作流程:

  • 1 javac对源代码分析,生成一棵抽象语法树(AST)

  • 2 javac编译过程调用Lombok程序

  • 3 插件对得到的AST处理,找到注解地点,修改语法树,添加注解定义响应的树节点

  • 4 javac将修改后的语法树(AST)生成字节码文件

4 关于Lombok总结

关于Lombok的使用,众说纷纭,有人支持,有份反对. 新的技术出现,必定解决了一些生活中的问题,也必然带来新的问题.

Lombok的使用,给代码带来了简洁美观, 节省大量基础代码.同时也带来了很多问题,如一人使用,全人必须使用;项目升级,新的框架能否使用该插件?

我相信Lombok插件未来发展会越来越好.

tips:

IDEA2020.3版本,已经将Lombok作为内置插件.SpringBoot的2.1.x版本在Starter中内置了Lombok依赖.

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/196068.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 让新手给练了(2021年春节)

    1.概述对于一个建站新手来讲,最重要的莫过于2件事1.时间效率 2.性价比 换句话讲,对于非专业选手,在整个建站过程,如何省时省力,用相对简单的方式,花更少的钱建好网站是关键。基于上述,给大家带来一版适合新手的建站指南,供大家参考2.建站指南建站三大必备条件:域名+主机空间(虚机主机/服务器)+建站程序无论你是自己建站还是外包第三方建站,都需要具备这三个要素才能建网站。2.1.注册域名注册域名(域名就是人们常说的“网址”,好比一个网站的门牌号,不可或缺)注意事项:1.

    2022年4月13日
    34
  • 解决进入vi 显示E325

    解决进入vi 显示E325在网上找了大量的帖子,有的有用,有的无用,今天自己摸索了一个办法,在命令端输入rm空格-rf空格图片中的箭头位置,这个位置是你创建的例如vim1.c回车后出现如图就一直回车回到vim页面进入命令模式输入:q!回车回到终端输入rm-rf.1.c.swp回车再重新进入…

    2022年5月19日
    105
  • Vue 分页器组件[通俗易懂]

    Vue 分页器组件[通俗易懂]<template><divclass=”pagination”><button>上一页</button><button@click=”changecurentpage(1)”v-if=”startEnd.start>1″>1</button><buttonv-if=”startEnd.start>2″>···</button><.

    2022年9月30日
    4
  • IsBackground对线程的重要作用「建议收藏」

    IsBackground对线程的重要作用「建议收藏」IsBackground对线程的重要作用要点:1、当在主线程中创建了一个线程,那么该线程的IsBackground默认是设置为FALSE的。2、当主线程退出的时候,IsBackground=FALSE的线程还会继续执行下去,直到线程执行结束。3、只有IsBackground=TRUE的线程才会随着主线程的退出而退出。4、当初始化一个线程,把T

    2022年10月10日
    3
  • lrzsz linux安装包,linux 离线安装lrzsz「建议收藏」

    lrzsz linux安装包,linux 离线安装lrzsz「建议收藏」安装gcc环境yuminstall–downloadonly–downloaddir=/usr/local/gccgccyuminstall–downloadonly–downloaddir=/usr/local/gcc++gcc-c++cd/usr/local/gcccd/usr/local/gcc++1.下载lrzsz-0.12.20.tar.gz2.上传压缩包到服…

    2022年6月23日
    89
  • 常用设计模式总结

    常用设计模式总结设计模式(Designpattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结,是可复用面向对象软件的基础。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现在中…

    2022年7月16日
    17

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号