一、什么是 Lombok
Lombok 是一个 Java 库,它通过注解的方式,帮助开发者消除一些样板代码,从而简化 Java 代码的编写。Lombok 提供了许多注解,用于自动生成构造函数、getter、setter、equals、hashCode 等方法,以及简化对象的创建和初始化等操作。
总的来说使用 Lombok 可以通过注解的方式帮助开发者消除样板代码,减少重复性工作。
二、Lombok 使用
步骤一:在项目中引入 Lombok 依赖
Maven 项目在项目的 pom.xml
文件中添加以下依赖:
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.22</version> <scope>provided</scope>
</dependency>
步骤二:安装 Lombok 插件
在你使用的集成开发环境(IDE)中安装 Lombok 插件。对于常见的 IDE 如 IntelliJ IDEA、Eclipse 等,都有对应的 Lombok 插件可供安装。安装完成后,重启 IDE 以使插件生效。
步骤三:在代码中使用 Lombok 注解
在需要使用 Lombok 功能的类或字段上添加相应的注解。在代码中使用 Lombok 提供的注解后,正常进行代码的编写、构建和运行即可。Lombok 插件会在编译时处理注解,并生成相应的代码。
以上是使用 Lombok 的基本步骤。通过引入 Lombok 依赖、安装插件并在代码中使用注解,你就可以充分利用 Lombok 提供的功能来简化代码编写,提高开发效率。
二、Lombok 的注解及其作用
@Getter
和 @Setter
自动生成属性的 getter 和 setter 方法。
import lombok.Getter;
import lombok.Setter;public class Person {@Getter @Setter private String name;@Getter @Setter private int age;
}
@FieldNameConstants
用于为类中的字段生成常量名称。
import lombok.experimental.FieldNameConstants;@FieldNameConstants
public class Person {private String name;private int age;
}
在上面的示例中,@FieldNameConstants
注解被用于 Person
类。当使用这个注解后,Lombok 会自动生成一个内部类,其中包含了类中所有字段的常量名称,以便在代码中使用。生成的内部类名称默认为 $FieldNameConstants
,可以通过@FieldNameConstants
注解的innerTypeName
属性进行自定义。
public class Main {public static void main(String[] args) {String fieldName = Person.$FieldNameConstants.name; // 使用生成的常量System.out.println(fieldName); // 输出: "name"}
}
@ToString
用于自动生成类的 toString ()
方法。
import lombok.ToString;@ToString
public class Person {private String name;private int age;
}
@EqualsAndHashCode
用于自动生成 equals ()
和 hashCode ()
方法。这两个方法是用于比较对象是否相等和生成对象的哈希码的重要方法。
import lombok.EqualsAndHashCode;@EqualsAndHashCode
public class Person {private String name;private int age;
}
@NoArgsConstructor
用于自动生成无参构造函数。
import lombok.NoArgsConstructor;@NoArgsConstructor
public class Person {private String name;private int age;
}
@AllArgsConstructor
用于自动生成包含所有非静态字段的参数的构造函数。
import lombok.AllArgsConstructor;@AllArgsConstructor
public class Person {private String name;private int age;
}
@RequiredArgsConstructor
用于自动生成一个包含所有 final
字段和带有 @NonNull
注解字段的构造函数
@RequiredArgsConstructor
public class Person {private final String name;private final int age;private String address;@NonNullprivate String phoneNumber;
}
对应生成的构造函数如下:
public Person (String name, int age, String phoneNumber) {this.name = name;this.age = age;this.phoneNumber = phoneNumber;
}
日志注解
-
@Log
: 生成一个名为log
的java.util.logging.Logger
日志记录器。 -
@Log4j
: 生成一个名为log
的org.apache.log4j.Logger
日志记录器。 -
@Log4j2
: 生成一个名为log
的org.apache.logging.log4j.Logger
日志记录器。 -
@Slf4j
: 生成一个名为log
的 SLF4J 日志记录器。 -
@XSlf4j
: 生成一个名为log
的参数化 SLF4J 日志记录器。 -
@CommonsLog
: 生成一个名为log
的 Apache Commons Logging 日志记录器。 -
@JBossLog
: 生成一个名为log
的 JBoss Logging 日志记录器。 -
@Flogger
: 生成一个名为log
的 Flogger 日志记录器。 -
@CustomLog
: 生成一个自定义名称的日志记录器。
使用方法如下:
import lombok.extern.java.Log;@Log
public class MyClass {public void myMethod() {log.info("Logging information message");log.warning("Logging warning message");}
}
@Data
用于自动生成 Java 类的标准样板代码,包括 toString
、equals
、hashCode
和字段的 getters
和 setters
方法。
import lombok.Data;@Data
public class Person {private String name;private int age;
}
@Builder
用于自动生成一个建造者模式(Builder Pattern)的构建器。使用 @Builder
注解后,Lombok 会生成一个名为 builder
的静态内部类,该构建器可以用于创建目标类的实例,并通过链式调用设置其属性。
import lombok.Builder;
import lombok.Data;@Data
@Builder
public class Person {private String name;private int age;
}
public class Main {public static void main(String[] args) {Person person = Person.builder().name("Alice").age(30).build(); // 使用生成的构建器创建实例System.out.println(person.toString());}
}
@SuperBuilder
它结合了 @Builder
和 @Super
注解的功能。与 @Builder
注解类似,使用 @SuperBuilder
注解后,Lombok 会生成一个包含父类属性的构建器,并且可以通过链式调用设置其属性。与 @Super
注解结合使用时,可以确保生成的构建器包含父类的属性。
@Singular
用于自动生成针对集合类型的添加方法。当在一个字段上使用 @Singular
注解时,Lombok 会自动生成针对该字段的添加方法,以便向集合中逐个添加元素。
import lombok.Builder;
import lombok.Singular;
import java.util.List;@Builder
public class Pizza {private String name;@Singular private List<String> toppings;
}
public class Main {public static void main(String[] args) {Pizza pizza = Pizza.builder().name("Vegetarian").topping("Mushrooms").topping("Onions").topping("Peppers").build(); // 使用生成的构建器创建实例System.out.println(pizza.toString());}
}
@Delegate
用于自动生成委托方法。当在一个字段上使用 @Delegate
注解时,Lombok 会自动生成委托方法,将指定字段的方法委托给另一个对象。
简单来说就是可以让你的类使用其他类的方法,而不需要自己写代码。
import lombok.experimental.Delegate;public interface Greet {void greet();
}public class GreetImpl implements Greet {@Overridepublic void greet() {System.out.println("Hello, world!");}
}public class GreetDelegate {@Delegate private final Greet greet = new GreetImpl();
}
public class Main {public static void main(String[] args) {GreetDelegate delegate = new GreetDelegate();delegate.greet(); // 执行委托方法}
}
@Value
用于生成一个不可变的、线程安全的值对象。当在一个类上使用 @Value
注解时,Lombok 会自动为该类的所有成员变量生成对应的 private final
字段,并生成对应的构造函数、getter
方法以及 equals
、hashCode
和 toString
方法。需要注意的是,使用 @Value
注解的类中的字段将被自动标记为 final
,并且无法通过普通的 setter
方法进行修改。
import lombok.Value;@Value
public class Person {String name;int age;
}
public class Main {public static void main(String[] args) {Person person = new Person("Alice", 30);System.out.println(person.getName()); // 访问生成的getter方法System.out.println(person.toString()); // 调用生成的toString方法}
}
@Accessors
用于配置生成的 getter 和 setter 方法的链式调用风格。通过 @Accessors
注解,可以自定义生成的方法的命名风格、前缀、是否使用链式调用等属性。
import lombok.Data;
import lombok.experimental.Accessors;@Data
@Accessors(prefix = "emp")
public class Employee {private String name;private int age;
}
在上面的示例中,@Accessors (prefix ="emp")
注解被用于 Employee
类。通过指定 prefix ="emp"
,Lombok 会生成以emp
作为前缀的 getter 和 setter 方法。
public class Main {public static void main(String[] args) {Employee employee = new Employee().empName("Alice").empAge(30);System.out.println(employee.empName()); // 访问生成的getter方法}
}
@Accessors
注解还提供了其他属性,如 fluent
用于控制是否启用链式调用、chain
用于控制链式调用的风格等,可以根据实际需求进行灵活配置。
@Wither
用于生成一个新的对象,该新对象在原对象的基础上修改了指定字段的数值。
import lombok.Value;
import lombok.experimental.Wither;@Value
public class Person {String name;int age;@Witherint age; // 通过@Wither生成的方法将修改age字段
}
public class Main {public static void main(String[] args) {Person person = new Person("Alice", 30);Person newPerson = person.withAge(31); // 生成的withAge方法用于创建新对象System.out.println(newPerson.toString()); // 输出新对象的信息}
}
通过使用 @Wither
注解,可以方便地创建一个新的对象,该对象在原对象的基础上修改了指定字段的值,同时保持其他字段的值不变。这在需要对不可变对象进行修改时非常有用。
需要注意的是,被 @Wither
注解的字段必须是 final
字段,或者使用 @Value
注解生成的不可变对象。
@With
与 @Wither
注解作用相似,用于生成一个新的对象,该新对象在原对象的基础上修改了指定字段的数值。与 @Wither
注解不同的是,@With
注解可以应用于任何字段,而不需要字段是final
的。
@SneakyThrows
用于在方法中抑制检查型异常的检查。使用 @SneakyThrows
注解后,Lombok 会自动在方法中抛出检查型异常,而无需显式地在方法签名中声明或捕获异常。
import lombok.SneakyThrows;public class Example {@SneakyThrowspublic void performIOOperation() {// 在此方法中进行IO操作,无需显式处理异常throw new IOException("Simulated IO Exception");}
}
在上面的示例中,@SneakyThrows
注解被用于 performIOOperation
方法。即使 IOException
是一个检查型异常,方法中仍然可以直接抛出该异常,而无需显式地在方法签名中声明或捕获异常。
public class Main {public static void main(String[] args) {Example example = new Example();example.performIOOperation(); // 可以直接调用抛出检查型异常的方法}
}
通过使用 @SneakyThrows
注解,可以简化代码,避免在方法签名中声明或捕获检查型异常,使代码更加简洁。然而,需要注意的是,过度使用 @SneakyThrows
可能会导致代码可读性下降,因此建议谨慎使用,并在必要时添加适当的异常处理逻辑。
@val
用于在声明变量的同时进行类型推断。通过使用 @val
注解,可以让 Lombok 自动根据变量的初始化表达式推断出变量的类型,从而简化代码。
import lombok.val;public class Example {public void demonstrateVal() {val list = new ArrayList<String>(); // 使用@val进行类型推断list.add("Hello, ");list.add("val!");for (val item : list) {System.out.print(item);}}
}
需要注意的是,@val
注解只能用于局部变量的声明,不能用于字段或方法参数的声明。此外,由于 @val
是 Lombok 提供的特殊注解,所以在使用时需要确保项目中引入了 Lombok 相关的依赖。
@UtilityClass
用于简化实用工具类(Utility Class)的编写。通过使用 @UtilityClass
注解,您可以将类标记为实用工具类,并使其成为一个不可实例化、只包含静态方法的类。同时,Lombok 会自动生成私有构造函数和禁止继承的措施,以确保该类被正确使用。
import lombok.experimental.UtilityClass;@UtilityClass
public class StringUtils {public String reverseString(String input) {return new StringBuilder(input).reverse().toString();}public boolean isNullOrEmpty(String input) {return input == null || input.isEmpty();}
}
public class Main {public static void main(String[] args) {String original = "Hello, World!";String reversed = StringUtils.reverseString(original);System.out.println(reversed); // 输出: !dlroW ,olleH}
}
通过使用 @UtilityClass
注解,可以使实用工具类的编写更加简洁,并且确保其被正确使用。这样可以避免手动编写私有构造函数和禁止继承的措施,减少样板代码的编写。
@Synchronized
用于生成同步代码块,以确保多线程环境下方法或代码块的安全性。通过使用 @Synchronized
注解,Lombok 会自动在方法或代码块上生成一个同步块,以保证同一时间只有一个线程可以访问被注解的方法或代码块。
import lombok.Synchronized;public class Example {@Synchronizedpublic void synchronizedMethod() {// 在此方法上生成同步块,确保多线程安全// ...}
}
@Synchronized
注解可以应用于实例方法、静态方法以及自定义的锁对象。