Lombok简单使用教程

目录

Lombok简介

Lombok使用准备

在对应的IDE中安装Lombok插件

添加Lombok依赖

常用功能

示例

关于Lombok的一些陷阱

关于equal和hashcode的问题:

违反了封装的原则

依赖性很强



Lombok简介

Lombok可以在你开发时提供Lombok的相关注解,在运行时给你生成相应的代码。从而可以简化项目结构,同时提高项目开发的效率。

Lombok使用准备

在对应的IDE中安装Lombok插件

如果需要使用Lombok,你就必须安装你的Lombok插件,插件下载地址:https://projectlombok.org/download。这里可以下载到通用的Lombok插件安装工具。下载完后双击jar包会出现如下界面:

Lombok插件安装界面

选择你需要安装的ide安装或者卸载即可。

添加Lombok依赖

项目中添加Lombok依赖(maven为例):

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

常用功能

  1. @Getter,生成get方法
  2. @Setter,生成set方法
  3. @ToString,生成toString方法
  4. @EqualsAndHashCode,生成hashcode和equals方法
  5. @Slf4j,在类开头生成日志模板代码
  6. @Data 整合@Getter、@Setter、@ToString
  7. @NoArgsConstructor 无参数构造方法
  8. @AllArgsConstructor所有属性构造方法
  9. @RequiredArgsConstructor 必要属性构造方法(final属性)

示例

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

@Data
@EqualsAndHashCode
@AllArgsConstructor
@RequiredArgsConstructor
@Slf4j
public class TestObj {

	private String name;
	
	private String mail;
	
	private final String sex;
	
	public static void main(String[] args) {
		TestObj t = new TestObj("1");
		t.setMail("123@123.com");
		t.setName("name");
		TestObj t1 = new TestObj("name", "123@123.com", "1");
		
		log.info(t.toString());
		log.info(t1.toString());
		log.info(String.valueOf(t.equals(t1)));
		log.info(t.getName());
	}
}

上述代码是Lombok的简单示例,是不是挺简单呢。

上述代码运行结果:

16:58:03.891 [main] INFO com.test.web.TestObj - TestObj(name=name, mail=123@123.com, sex=1)
16:58:03.895 [main] INFO com.test.web.TestObj - TestObj(name=name, mail=123@123.com, sex=1)
16:58:03.895 [main] INFO com.test.web.TestObj - true
16:58:03.895 [main] INFO com.test.web.TestObj - name

当然更多Lombok的功能希望读本文的你可以自己去探索。

关于Lombok的一些陷阱

关于equal和hashcode的问题:

请参看如下例子:

Person.java

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class Person {

	private String name;
	private String id;
}

Worker.java

import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;

@EqualsAndHashCode
@Getter
@Setter
public class Worker extends Person {

	private String job;
	
	public static void main(String[] args) {
		Worker worker = new Worker();
		worker.setId("1");
		worker.setName("test1");
		worker.setJob("砖瓦匠");
		
		Worker worker2 = new Worker();
		worker2.setId("2");
		worker2.setName("test2");
		worker2.setJob("砖瓦匠");
		System.out.println(worker.equals(worker2));
	}
}

上述结果返回的是true,显然,worker和worker2不属于一个人,所以这里是有问题的,在新版本的ide中,会有个警告的提示:

Generating equals/hashCode implementation but without a call to superclass, even though this class does not extend java.lang.Object. If this is intentional, add '@EqualsAndHashCode(callSuper=false)' to your type.

意思是默认情况下,Lombok会认为你只比较当前类的属性,所以你需要添加属性:callSuper = true,但@Data并无此属性,所以慎用@Data。

具体的代码为:

@EqualsAndHashCode(callSuper = true)

所以个人其实不太建议使用Lombok的@Data注解和@EqualsAndHashCode注解。

违反了封装的原则

对于Lombok,如果生成了get与set方法,会把对象下的所有属性都生成对应的方法,这样如果有些属性你并不希望外界获取,就无法满足。最常见的一种设计就是类似集合,通常我们都会用一个add方法来添加元素,这样在其他类调用我的时候就只能做新增操作。如果其他类获取了我的list就可以做清空等操作,亦或者是你不希望外部去设置你这个属性的值(这种场景建议使用final属性,但设置成final属性又会生成对应的参数构造方法,也不是一个好的解决方案),Lombok同样会生成对应的set方法。示例代码如下:

package com.buss.data.bean;

import java.util.ArrayList;
import java.util.List;

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class Worker extends Person {

	private String job;
	
	public List<String> hobbies = new ArrayList<String>();
	
	public void addHobby(String hobby) {
		this.hobbies.add(hobby);
	}
	
	public static void main(String[] args) {
		Worker worker = new Worker();
		worker.addHobby("swing");
		worker.getHobbies().clear();
		
		System.out.println(worker.getHobbies());
	}
}

如果你不希望出现这样的情况,那么Lombok可能对你来说不是一个好的选择。总的来说便利就会带来一些东西无法定制化。所以这些情况需要酌情考虑。

依赖性很强

如果项目使用了Lombok,那么你的项目成员的IDE都是必须安装Lombok插件的,这样其实是一种强侵入性的做法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值