最全 Lombok介绍、使用方法和总结( 二 )

 
2.2 @Getter/@Setter
如果觉得@Data太过残暴(因为@Data集合了@ToString、@EqualsAndHashCode、@Getter/@Setter、@RequiredArgsConstructor的所有特性)不够精细 , 可以使用@Getter/@Setter注解 , 此注解在属性上 , 可以为相应的属性自动生成Getter/Setter方法 , 示例如下:
 
import lombok.AccessLevel;import lombok.Getter;import lombok.Setter;public class GetterSetterExample { @Getter @Setter private int age = 10;@Setter(AccessLevel.PROTECTED) private String name;@Override public String toString() { return String.format("%s (age: %d)", name, age); }} 
如果不使用Lombok:
 
public class GetterSetterExample { private int age = 10; private String name;@Override public String toString() { return String.format("%s (age: %d)", name, age); }public int getAge() { return age; }public void setAge(int age) { this.age = age; }protected void setName(String name) { this.name = name; }} 
2.3 @NonNull
该注解用在属性或构造器上 , Lombok会生成一个非空的声明 , 可用于校验参数 , 能帮助避免空指针 。
示例如下:
 
import lombok.NonNull;public class NonNullExample extends Something { private String name;public NonNullExample(@NonNull Person person) { super("Hello"); this.name = person.getName(); }} 
【最全 Lombok介绍、使用方法和总结】不使用Lombok:
 
import lombok.NonNull;public class NonNullExample extends Something { private String name;public NonNullExample(@NonNull Person person) { super("Hello"); if (person == null) { throw new NullPointerException("person"); } this.name = person.getName(); }} 
2.4 @Cleanup
该注解能帮助我们自动调用close()方法 , 很大的简化了代码 。
示例如下:
 
import lombok.Cleanup;import java.io.*;public class CleanupExample { public static void main(String[] args) throws IOException { @Cleanup InputStream in = new FileInputStream(args[0]); @Cleanup OutputStream out = new FileOutputStream(args[1]); byte[] b = new byte[10000]; while (true) { int r = in.read(b); if (r == -1) break; out.write(b, 0, r); } }} 
如不使用Lombok , 则需如下:
 
import java.io.*;public class CleanupExample { public static void main(String[] args) throws IOException { InputStream in = new FileInputStream(args[0]); try { OutputStream out = new FileOutputStream(args[1]); try { byte[] b = new byte[10000]; while (true) { int r = in.read(b); if (r == -1) break; out.write(b, 0, r); } } finally { if (out != null) { out.close(); } } } finally { if (in != null) { in.close(); } } }} 
2.5 @EqualsAndHashCode
默认情况下 , 会使用所有非静态(non-static)和非瞬态(non-transient)属性来生成equals和hasCode , 也能通过exclude注解来排除一些属性 。
示例如下:
 
import lombok.EqualsAndHashCode;@EqualsAndHashCode(exclude={"id", "shape"})public class EqualsAndHashCodeExample { private transient int transientVar = 10; private String name; private double score; private Shape shape = new Square(5, 10); private String[] tags; private int id;public String getName() { return this.name; }@EqualsAndHashCode(callSuper=true) public static class Square extends Shape { private final int width, height;public Square(int width, int height) { this.width = width; this.height = height; } }} 
2.6 @ToString
类使用@ToString注解 , Lombok会生成一个toString()方法 , 默认情况下 , 会输出类名、所有属性(会按照属性定义顺序) , 用逗号来分割 。
通过将includeFieldNames参数设为true , 就能明确的输出toString()属性 。这一点是不是有点绕口 , 通过代码来看会更清晰些 。
使用Lombok的示例:
 
import lombok.ToString;@ToString(exclude="id")public class ToStringExample { private static final int STATIC_VAR = 10; private String name; private Shape shape = new Square(5, 10); private String[] tags; private int id;public String getName() { return this.getName(); }@ToString(callSuper=true, includeFieldNames=true) public static class Square extends Shape { private final int width, height;public Square(int width, int height) { this.width = width; this.height = height; } }} 
不使用Lombok的示例如下:
 
import java.util.Arrays;public class ToStringExample { private static final int STATIC_VAR = 10; private String name; private Shape shape = new Square(5, 10); private String[] tags; private int id;public String getName() { return this.getName(); }public static class Square extends Shape { private final int width, height;public Square(int width, int height) { this.width = width; this.height = height; }@Override public String toString() { return "Square(super=" + super.toString() + ", width=" + this.width + ", height=" + this.height + ")"; } }@Override public String toString() { return "ToStringExample(" + this.getName() + ", " + this.shape + ", " + Arrays.deepToString(this.tags) + ")"; }}


推荐阅读