文章以一个方法一个代码块的方式演示.
简单几个注解
-
set和get方法
@Getter / @Setter -
toString方法
@ToString -
equals和hashCode方法
@EqualsAndHashCode -
Data
@Data 通常这个方法就够了, 包含上面几个注解. -
全参, 无参
@AllArgsConstructor, @NoArgsConstructor -
不能为空
@NonNull, 作用到属性上是, 如果不赋值会抛空指针 -
日志
@Slf4j
链式调用
通过设置
@Accessors
的chain=true
public class LombokTest {
public static void main(String[] args) {
Student student = new Student();
student.setName("yzt").setAge(22);
}
}
@Data
@Accessors(chain = true)
class Student {
private String name;
private Integer age;
}
静态方法构造器
通过 @NonNull
和 @RequiredArgsConstructor(staticName = "ofName")
实现.
在 name
属性上添加 @NonNull
注解标识不能为空, 然后通过 RequiredArgsConstructor
的 staticName
属性设置静态构造器的名称.
当然也是可以不使用 @NonNull
属性的, 标识静态构造器是 空参 的
带参数的构造
public class LombokTest {
public static void main(String[] args) {
Student student = Student.ofName("yzt").setAge(22);
System.out.println(student);
}
}
@Data
@Accessors(chain = true)
@RequiredArgsConstructor(staticName = "ofName")
class Student {
@NonNull
private String name;
private Integer age;
}
空参构造
public class LombokTest {
public static void main(String[] args) {
Student student = Student.of().setName("yzt").setAge(22);
System.out.println(student);
}
}
@Data
@Accessors(chain = true)
@RequiredArgsConstructor(staticName = "of")
class Student {
private String name;
private Integer age;
}
builder 模式
public class LombokTest {
public static void main(String[] args) {
Student student = Student.builder().name("yzt").age(22).build();
System.out.println(student);
}
}
@Data
@Builder
class Student {
private String name;
private Integer age;
}
工具类
@UtilityClass
注解作用在工具方法上, 会私有构造, 然后为方法添加 static
关键字. 注意下方我演示的 getIp()
方法没有添加 static
关键字也能够调用.
public class LombokTest {
public static void main(String[] args) {
String ip = HttpKit.getIp();
System.out.println(ip);
}
}
@UtilityClass
class HttpKit {
public String getIp() {
return "127.0.0.1";
}
}
去除统一前缀
这个在使用的时候命名一定要使用 驼峰命名法, 不然会出现莫名其妙的问题.
public class LombokTest {
public static void main(String[] args) {
Student student = new Student();
student.setName("yzt");
student.setAge(22);
System.out.println(student);
}
}
@Data
@Accessors(prefix = "f")
class Student {
private String fName;
private Integer fAge;
}
set/get 方法不以 set/get 开头
就相当于去掉了 set/get 前缀的 set/get 方法. 不推荐使用. 不符合Java规范.
public class LombokTest {
public static void main(String[] args) {
Student student = new Student();
student.name("yzt");
student.age(22);
System.out.println(student.name());
}
}
@Data
@Accessors(fluent = true)
class Student {
private String name;
private Integer age;
}
代理方法
这个说起来有点懵逼, 直接看代码可能更清晰.
public class LombokTest {
public static void main(String[] args) {
User user = new User();
user.add("yzt"); // 这里其实调用的是 TemplateCollection 的方法
user.add("xxx");
user.add("yyy");
System.out.println(user);
user.remove("yyy");
System.out.println(user);
}
}
@ToString
class User {
private interface TemplateCollection {
boolean add(String obj);
boolean remove(Object obj);
}
@Delegate(types = TemplateCollection.class)
private final Collection<String> users = new ArrayList<>();
}
输出:
User(users=[yzt, xxx, yyy])
User(users=[yzt, xxx])
后记
编译注解到代码
通过菜单栏的 Refactor -> delombok
就可以得到源代码了
关于lombok
在 lombok.experimental.*
包下的是创新型注解. 与Java规范不符合, 有待考证
在 lombok.*
包下的放心使用.