首页 > 其他分享 >lombok使用

lombok使用

时间:2023-07-15 19:22:06浏览次数:36  
标签:name public User 使用 import lombok id String

添加依赖

		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<optional>true</optional>
		</dependency>

@Getter和@Setter

自动生成Getter和Setter方法

import lombok.AccessLevel;
import lombok.Getter;
import lombok.Setter;

public class User {
	@Getter @Setter	private Integer id;
	@Setter(AccessLevel.PROTECTED) private String name;
}

等效的java代码

public class User {
	private Integer id;
	private String name;

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

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

@ToString

自动生成toString()方法

import lombok.ToString;

@ToString
public class User {
	private Integer id = 1;
	private String name = "zhangsan";
	private String password = "xxx";

	public static void main(String[] args) {
		User user = new User();
		System.out.println(user);
	}
}

执行结果

User(id=1, name=zhangsan, password=xxx)

等效的toString()代码

	@Override
	public String toString() {
		return "User{" + "id=" + id + ", name=" + name + ", password=" + password + "}";
	}

idea自动生成的toString()会将String类型用单引号'括起来, 二者略有差别

    @Override
	public String toString() {
		return "User{" + "id=" + id + ", name='" + name + '\'' + ", password='" + password + '\'' + '}';
	}

对应结果为:

User{id=1, name='zhangsan', password='xxx'}

如果只想展示部分字段, 可用of来指定字段, 或者使用exclude来排除字段

@ToString(of = {"id", "name"})

或者
@ToString(exclude = {"password"})

或者直接注解字段 @ToString.Exclude
@ToString.Exclude private String password = "xxx";

对应结果为:

User(id=1, name=zhangsan)

@EqualsAndHashCode

除了生成equals()hashCode(), 还有一个canEqual(Object other), 用来判断对象other是否是当前类的实例
官网示例: https://projectlombok.org/features/EqualsAndHashCode

构造方法

@NoArgsConstructor: 无参构造方法

@AllArgsConstructor: 全参构造方法

@RequiredArgsConstructor: 部分参数构造方法,需要搭配@NonNull使用

官网示例: https://projectlombok.org/features/constructor

@Data

一般情况下, 这一个注解就相当于上面的 @Getter @Setter @ToString @EqualsAndHashCode @NoArgsConstructor

img

如果有字段加了@NonNull, 则相当于 @RequiredArgsConstructor

img

也可以通过以下命令来验证:

#编译.java文件,生成.class文件
javac -cp .\lombok-1.18.16.jar .\User.java
#反编译.class文件,查看类的具体信息
javap User

img

@Cleanup

资源操作时,自动调用close()方法

import lombok.Cleanup;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class TestCleanup {

	public static void main(String[] args) throws IOException {
		@Cleanup InputStream is = new FileInputStream("/home/1.txt");
		@Cleanup OutputStream os = new FileOutputStream("/home/2.txt");
		byte[] bytes = new byte[1024];
		while (true) {
			int length = is.read(bytes);
			if (length == -1) {
				break;
			}
			os.write(bytes, 0, length);
		}
	}
}

等效的java代码

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class TestCleanup {

	public static void main(String[] args) throws IOException {
		InputStream is = new FileInputStream("/home/1.txt");
		try {
			OutputStream os = new FileOutputStream("/home/2.txt");
			try {
				byte[] bytes = new byte[1024];
				while (true) {
					int length = is.read(bytes);
					if (length == -1) {
						break;
					}
					os.write(bytes, 0, length);
				}
			} finally {
				if (os != null) {
					os.close();
				}
			}
		} finally {
			if (is != null) {
				is.close();
			}
		}
	}
}

@Builder

import lombok.Builder;

@Builder
public class User {
	private Integer id;
	private String name;
}

可以实现链式调用的写法,赋值方便

User user = User.builder().id(1).name("zhangsan").build();

反编译后

public class User {
    private Integer id;
    private String name;

    User(Integer var1, String var2) {
        this.id = var1;
        this.name = var2;
    }

    public static User.UserBuilder builder() {
        return new User.UserBuilder();
    }

    public static class UserBuilder {
        private Integer id;
        private String name;

        UserBuilder() {
        }

        public User.UserBuilder id(Integer var1) {
            this.id = var1;
            return this;
        }

        public User.UserBuilder name(String var1) {
            this.name = var1;
            return this;
        }

        public User build() {
            return new User(this.id, this.name);
        }

        public String toString() {
            return "User.UserBuilder(id=" + this.id + ", name=" + this.name + ")";
        }
    }
}

编译后的代码中, 多了一个静态内部类 User.UserBuilder, 属性和 User 相同

  1. 每个属性都有一个类似 setter 的方法, 但返回的是对象本身, 使得可以实现链式调用的写法
  2. @Builder 会默认生成一个全参构造方法, 如果想用无参构造方法需要把 @NoArgsConstructor@AllArgsConstructor 都加上
  3. 如果只加了 @NoArgsConstructor 会覆盖全参构造方法,导致报错
    img

优点: 链式调用写法赋值更方便, 注意如果赋值较多,不要写在一行,不利于阅读维护
缺点: 生成User示例之前, 会先生成User.UserBuilder实例,额外占用内存

选项toBuilder, 默认false, 为true时, 会多一个toBuilder()方法

@Builder(toBuilder = true)
public class User {
    //...
}

//编译后代码
public class User {
    //...
    //编译后多了一个 toBuilder()方法
    //用当前对象的属性来构造一个新的Builder对象
    public User.UserBuilder toBuilder() {
        return (new User.UserBuilder()).id(this.id).name(this.name);
    }
    //...
}

官网

https://projectlombok.org/features/

标签:name,public,User,使用,import,lombok,id,String
From: https://www.cnblogs.com/qode/p/17556728.html

相关文章

  • win11 Copilot开启使用
    1.升级更新Windows预览版234932.更新Edge版本1153.安装ViVeToolv0.3.3地址:https://github.com/thebookisclosed/ViVe/releases/tag/v0.3.3 教程:https://blog.csdn.net/qq_36693723/article/details/131583470......
  • 项目使用分库分表
     股票关联分管人的分管中心,标的信息,投标信息,先对数据库进行分库,相同发标人的数据还要保证不能分散,就用的任务id+发标人的分管人id进行基因法拼凑,避免跨库查询 ......
  • Docker部署nextcloud及其使用方法
    Docker部署Nextcloud及其使用方法Docker安装Docker是一个开源的应用容器引擎,基于Go语言并遵从Apache2.0协议开源。Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。容器是完全使用沙箱机......
  • 如何使用C#中的Lambda表达式操作Redis Hash结构,简化缓存中对象属性的读写操作
    Redis是一个开源的、高性能的、基于内存的键值数据库,它支持多种数据结构,如字符串、列表、集合、散列、有序集合等。其中,Redis的散列(Hash)结构是一个常用的结构,今天跟大家分享一个我的日常操作,如何使用Redis的散列(Hash)结构来缓存和查询对象的属性值,以及如何用Lambda表达式树来简化......
  • openEuler(华为欧拉)使用docker安装wine 8+版本,支持32位程序
    安装docker参考:openEuler安装docker下载wine镜像wine的docker镜像,支持i386点击上述网址,查看、选择你想要安装的版本,例如8.0.1.使用以下命令安装:dockerpulltianon/wine:8.0.1启动wine容器下载完成后,使用以下命令启动:dockerrun-it-eDISPLAY=$DISPLAY-v$(pwd):/mnt......
  • LayoutRebuilder.ForceRebuildLayoutImmediate的使用和坑点
    LayoutRebuilder.ForceRebuildLayoutImmediate可以强制刷新layout组件,在使用layout和contentsizefitter组件制作如聊天框这种根据文字改变大小之类的UI时很好用。不过LayoutRebuilder.ForceRebuildLayoutImmediate有个坑点,其只有在物体激活时才会生效。......
  • 使用MyBatis Plus
    IDEA配置IDEA安装MyBatisX插件。根据IDEA指引来创建SpringBoot项目mybatisplus-demo1。添加依赖添加mybatisplus和lombok依赖<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.1.0&......
  • MyBatis框架使用问题
    Mybatis根据数组或者List查询List结果数组参数//接口方法ArrayList<User>selectByIds(Integer[]ids);//xml映射文件<selectid="selectByIds"resultMap="BaseResultMap">select*fromuserwhereidin<foreachitem="item&quo......
  • 【Oracle】在PL/SQL中使用sql实现插入排序
    【Oracle】在PL/SQL中使用sql实现插入排序一般来说,SQL要排序的话直接使用orderby即可不一般来说,就是瞎搞,正好也可以巩固自己的数据结构基础,主要也发现没有人用SQL去实现这些算法(小声bb)使用SQL实现排序系列:使用SQL实现冒泡排序使用SQL实现选择排序以下是正文:规范:createor......
  • .NET个人博客-使用Back进行消息推送
    使用Back推送消息到你的iPhone前言我的好友看了我的博客,给我提了个需求,让我搞个网站通知,我开始以为就是评论回复然后发送邮件通知。不过他告诉我网站通知是,当有人评论或者留言后,会通知到我这边来,消息是实时通知的,他说用的是Back,不需要发邮件,然后发了个GitHub链接给我,我觉得还不......