当前位置: 首页 > news >正文

Lombok

文章目录

    • 简介
    • 原理
    • 安装
    • 常用
      • @Getter、@Setter
      • @ToString
      • @EqualsAndHashCode
      • @NonNull
      • @NoArgsConstructor、@RequiredArgsConstructor、@AllArgsConstructor
      • @DATA
      • @Builder
      • @Log
      • val
      • @Cleanup

简介

Project Lombok is a java library that automatically plugs into your editor and build tools, spicing up your java.
Never write another getter or equals method again, with one annotation your class has a fully featured builder, Automate your logging variables, and much more.

通过注解帮助开发人员消除Java中的冗长代码(简单的Java对象)

原理

JSR 269:插件化注解处理API

javac编译阶段给被注解的类加上对应的方法

Annotation_Processing
Lmobok_Annotation_Processor处理
AST语法树解析开始
AST语法树修改
Lombok_Annotation_Handler
开始
解析并转换为Java源文件
AST语法树修改完成
分析并生成字节码Class文件
结束

安装

使用

  • javac

    • 拷贝jar到类路径
    • javac -cp lombok.jar [待编译的包]
  • Maven

    • 引入依赖

      <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.10</version><scope>compile</scope>
      </dependency>
      
  • Intelllij IDEA

    • 安装Lombok插件
      • Go to File>Settins>Plugins
      • Clik on Browse repositories
      • Seach for Lombok Plugin
      • Clik on Install plugin
      • Restart Intellij IDEA

常用

  1. @Getter/@Setter
  2. @ToString
  3. @EqualsAndHashCode
  4. @NonNull
  5. @NoArgsConstructor,@RequiredArgsConstructor,@AllArgsConstruor
  6. @Data
  7. @Builder
  8. @Log
  9. val
  10. @Cleanup

@Getter、@Setter

可以用于类和成员变量上

@Getter //public,默认值
@Getter(AccessLeavel.PUBLIC) //public
@Getter(AccessLeavel.PROTECTED) //protected
@Getter(AccessLeavel.NONE) //不生成Getter方法

@Setter //public,默认值

//对被static修饰的变量不产生效果
//对被final修饰的变量只产生getter方法,不产生setter方法

@Getter
@Setter
public class User {private String userName;private Integer age;
}//编译后
public class User {private String userName;private Integer age;public User() {}public String getUserName() {return this.userName;}public Integer getAge() {return this.age;}public void setUserName(String userName) {this.userName = userName;}public void setAge(Integer age) {this.age = age;}
}
@Getter(AccessLevel.PRIVATE)
@Setter(AccessLevel.PROTECTED)
public class User {@Getter(AccessLevel.NONE)private String userName;@Setter(AccessLevel.NONE)private Integer age;
}//编译后
public class User {private String userName;private Integer age;public User() {}private Integer getAge() {return this.age;}protected void setUserName(String userName) {this.userName = userName;}
}
@Getter
@Setter(AccessLevel.PUBLIC)
public class User {private final String userName="";private static Integer age;
}//编译后
public class User {private final String userName = "";private static Integer age;public User() {}public String getUserName() {this.getClass();return "";}
}

@ToString

//仅支持添加到类上
@ToString	//默认不排除任何字段
@ToString(exclude={"email","password"})	//排除email和password
@ToString(of={"userName","age"});	//只输出userName和password字段
@ToString
public class User {private String userName;private Integer age;
}//编译后
public class User {private String userName;private Integer age;public User() {}public String toString() {return "User(userName=" + this.userName + ", age=" + this.age + ")";}
}
@ToString(of = {"userName"},exclude = {"userName"})
public class User {private String userName;private Integer age;
}//编译后
public class User {private String userName;private Integer age;public User() {}public String toString() {return "User(userName=" + this.userName + ")";}
}

@EqualsAndHashCode

boolean equals(Object);	//判断对象是否相等
boolean canEqual(Object);	//判断对象是不是该类的一个实例
int hashCode();	//计算对象的hash值@EqualsAndHashCode(excelude={"phone","password"})	//排除phone、password字段
@EqualsAndHashCode(of={"userName","passwd"})	//仅判断userName与passwd属性
@EqualsAndHashCode
public class User {private String userName;private Integer age;
}//编译后
public class User {private String userName;private Integer age;public User() {}public boolean equals(Object o) {if (o == this) {return true;} else if (!(o instanceof User)) {return false;} else {User other = (User)o;if (!other.canEqual(this)) {return false;} else {Object this$userName = this.userName;Object other$userName = other.userName;if (this$userName == null) {if (other$userName != null) {return false;}} else if (!this$userName.equals(other$userName)) {return false;}Object this$age = this.age;Object other$age = other.age;if (this$age == null) {if (other$age != null) {return false;}} else if (!this$age.equals(other$age)) {return false;}return true;}}}protected boolean canEqual(Object other) {return other instanceof User;}public int hashCode() {int PRIME = true;int result = 1;Object $userName = this.userName;result = result * 59 + ($userName == null ? 43 : $userName.hashCode());Object $age = this.age;result = result * 59 + ($age == null ? 43 : $age.hashCode());return result;}
}

@NonNull

//可以用于实参与属性值
public void test(@NonNll String s){//方法体
}//test()编译后
public void testj(@NonNull String s){if(s==null){throw new NullPonintException("s is marked non-null but is null");}else{//方法体}
}//调用时
mian(){test(null);	//当传入的值为空时,会报出异常
}@NonNull
private String id;	//调用时若id为空,会抛出异常

@NoArgsConstructor、@RequiredArgsConstructor、@AllArgsConstructor

@NoArgsConstructor	//无参构造器
@RequiredArgsConstructor	//自定义构造器,生成带有标记为@NonNull和无初始值的final的属性的构造器
@AllArgsConstructor	//带有所有属性的构造器

@DATA

/*
集成了以下4个注解
@Getter/@Setter
@ToString
@EqualsAndHashCode
@RequiredArgsConstructor
*/
@Data
public class User {private String userName;private Integer age;
}//编译后
public class User {private String userName;private Integer age;public User() {}public String getUserName() {return this.userName;}public Integer getAge() {return this.age;}public void setUserName(String userName) {this.userName = userName;}public void setAge(Integer age) {this.age = age;}public boolean equals(Object o) {if (o == this) {return true;} else if (!(o instanceof User)) {return false;} else {User other = (User)o;if (!other.canEqual(this)) {return false;} else {Object this$userName = this.getUserName();Object other$userName = other.getUserName();if (this$userName == null) {if (other$userName != null) {return false;}} else if (!this$userName.equals(other$userName)) {return false;}Object this$age = this.getAge();Object other$age = other.getAge();if (this$age == null) {if (other$age != null) {return false;}} else if (!this$age.equals(other$age)) {return false;}return true;}}}protected boolean canEqual(Object other) {return other instanceof User;}public int hashCode() {int PRIME = true;int result = 1;Object $userName = this.getUserName();result = result * 59 + ($userName == null ? 43 : $userName.hashCode());Object $age = this.getAge();result = result * 59 + ($age == null ? 43 : $age.hashCode());return result;}public String toString() {return "User(userName=" + this.getUserName() + ", age=" + this.getAge() + ")";}
}

@Builder

//生成一个内部类
public class User{UserBuilder(){final String userName;final int age;UserBuilder();	//无参构造UserBuilder userName(String userName)	//设置userName的值UserBuilder age(int age)	//设置age}private String userName;private int age;UserBuilder builder()
}//调用,链式编程
main(){User user = User.bulder().userName("joey").age(18).build();
}
@Builder
public class User {private String userName;private Integer age;
}//编译后
public class User {private String userName;private Integer age;User(String userName, Integer age) {this.userName = userName;this.age = age;}public static UserBuilder builder() {return new UserBuilder();}public static class UserBuilder {private String userName;private Integer age;UserBuilder() {}public UserBuilder userName(String userName) {this.userName = userName;return this;}public UserBuilder age(Integer age) {this.age = age;return this;}public User build() {return new User(this.userName, this.age);}public String toString() {return "User.UserBuilder(userName=" + this.userName + ", age=" + this.age + ")";}}
}

@Log

@Log	
//调用log.info(Stirng)//

val

val map = new HashMap<String,String>();
//map不限制类型,在编译时确定map的类

@Cleanup

//使用Cleanup之前
InputStream in = null;
OutputStream out = null;
try{in = new FileInputStream("filepath");out = new FileoutputStream("path");byte[] b = new byte[1000];while(true){int r = in.read(b);if(r == -1) break;out.write(b,0,r);}
}finally{if(in != null){in.close();}if(out != null){out.close();}
}
//使用@Cleanup后
//可以省去关闭流的操作
@Cleanup InputStream in = new FileInputStream("filepath");
@Cleanup OutputStream out = new FileOutputStream("path");
//省去try-cath-finally等操作
byte[] b = new byte[1000];
while(true){int r = in.read(b);if(r == -1) break;out.write(b,0,r);
}
http://www.lryc.cn/news/38624.html

相关文章:

  • Koa源码学习
  • 一种延迟加载自定义元素的方法
  • Pytho经典面试题荟萃:第一期
  • 01背包问题(大彻大悟版)
  • 【麒麟服务器操作系统忘记开机密码怎么办?---银河麒麟服务器操作系统更改用户密码】
  • 华为OD机试(20222023)考点分类
  • 初级篇 3 - HTML 或 CSS 文件中不懂的标签属性详解
  • 【C语言】每日刷题 —— 牛客语法篇(4)
  • HashMap ConcurrentHashMap介绍
  • C++语法规则3(C++面向对象)
  • Python tkinter 如何实现网站下载工具?将所有数据一键获取
  • 第六章:C语言数据结构与算法初阶之栈
  • Android学习之WebView
  • 3/11 考试总结
  • Leetcode 141.环形链表 142环形链表II
  • hibernate学习(五)
  • STM32CubeIDE 快速开发入门指南
  • 华为OD机试 - 火星文计算(C 语言解题)【独家】
  • 超超超超保姆式详解——字符函数和字符串函数(学不会打我)上
  • Data mesh 笔记
  • (八十三)大白话透彻研究通过explain命令得到的SQL执行计划(2)
  • 案例18-面向对象之开门小例子
  • 【碎片化知识总结】三月第一周
  • 从零开始的JSON库(1):启程
  • 【Java】数组
  • 【C++】非类型的模板参数,特化
  • 核方法(kernel Method)
  • 消息队列MQ用来做什么的,市场上主流的四大MQ如何选择?RabbitMQ带你HelloWorld!
  • 2023年中国高校计算机大赛-团队程序设计天梯赛(GPLT)上海理工大学校内选拔赛(同步赛) A — E
  • 一文分析Linux v4l2框架