使用lombok简化代码
举例
代码清单
对应代码
@Getter @Setter demo.data.Person @Data == @ToString, @EqualsAndHashCode, @Getter @Cleanup demo.other.Test_Cleanup val: 定义final变量 demo.other.Test_Val
|
@Getter @Setter
package demo.data;
import java.util.List;
import lombok.Getter;
import lombok.NonNull;
import lombok.Setter;
public class Person {
@Getter @Setter @NonNull
private List<String> cars;
}
//=>相当于
class Person2 {
@NonNull
private List<String> cars;
public Person2(@NonNull final List<String> cars) {
if (cars == null) throw new java.lang.NullPointerException("members");
this.cars = cars;
}
@NonNull
public List<String> getMembers() {
return cars;
}
public void setMembers(@NonNull final List<String> cars) {
if (cars == null) throw new java.lang.NullPointerException("members");
this.cars = cars;
}
}@NonNull
package demo.other;
import lombok.Data;
import lombok.NonNull;
/**
* 与@Data配合使用,则会生成包含pwd的构造器
* 当new Test_nonNull(null);则会抛出空指针异常
*/
@Data
public class Test_nonNull {
@NonNull
String pwd;
public static void main(String[] args) {
new Test_nonNull(null);
Test_nonNull2.hello(null);
}
}
class Test_nonNull2 {
static void hello(@NonNull String str) {
System.out.println("参数null检查。 调用该方法时,传入null则抛出空指针异常");
}
}
@ToString
package demo.data;
import java.util.Arrays;
import lombok.ToString;
@ToString(callSuper=true,exclude="someExcludedField")
public class SuperMan extends Person{
private boolean someBoolean = true;
private String someStringField;
private float someExcludedField;
public static void main(String[] args) {
SuperMan man = new SuperMan();
man.setCars(Arrays.asList("big car", "small car"));
System.out.println(man);
}
}
//=>相当于
class SuperMan2 extends Person{
private boolean someBoolean = true;
private String someStringField;
private float someExcludedField;
@java.lang.Override
public java.lang.String toString() {
return "SuperMan(super=" + super.toString() +
", someBoolean=" + someBoolean +
", someStringField=" + someStringField + ")";
}
}
@EqualsAndHashCode
package demo.EqualsAndHashCode;
import lombok.EqualsAndHashCode;
import lombok.NonNull;
/*
*
* 1. 通过of属性表明只使用某些字段,或者exclude属性表明不包含哪些字段
*
* 2. 当类继承了非Object类时,equals和hashcode方法是不会使用父类中的字段的。
* 需要使用父类字段则需要 @EqualsAndHashCode( callSuper=true)
* 如果没有继承其他类,却使用callSuper,则会报编译错误
*
* 3. 使用的是非 static,transient修饰的所有属性
*/
@EqualsAndHashCode(callSuper=true,exclude={"address","city","state","zip"})
public class Person extends Person2 {
enum Gender { Male, Female }
@NonNull private String name;
@NonNull private Gender gender;
private String ssn;
private String address;
}
class Person2 {
private String city;
private String state;
private String zip;
}@Data
组合拳:
1. 相当于@ToString, @EqualsAndHashCode, @Getter ,
2. 同时@Setter 加在了没有NonNull注解的字段,
3. 以及@RequiredArgsConstructor
package demo.data;
import lombok.AccessLevel;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
@Data
public class User1 {
String userName;
String pwd;
}
class User2 {
@Getter @Setter
String pwd;
@Setter(AccessLevel.PROTECTED)
String userName;
}@Builder
package demo.data;
import java.util.Set;
import com.alibaba.fastjson.JSON;
import lombok.Builder;
import lombok.Data;
import lombok.Singular;
@Builder
@Data
public class Test_Builder {
String name;
int age;
@Singular
private Set<String> als;
public static void main(String[] args) {
Test_BuilderBuilder builder = Test_Builder.builder();
Test_Builder example = builder.name("张三").age(10).al("cat").al("pig").build();
System.out.println("builder: " + builder);
System.out.println("实体: " + example);
System.out.println(JSON.toJSONString(example));
}
}@Cleanup
package demo.other;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import lombok.Cleanup;
public class Test_Cleanup {
public static void main(String[] args) {
try {
@Cleanup
ByteArrayOutputStream baos = new ByteArrayOutputStream();
baos.write(new byte[] { 'Y', 'e', 's' });
System.out.println(baos.toString());
} catch (IOException e) {
e.printStackTrace();
}
// =>相当于
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
baos.write(new byte[] { 'Y', 'e', 's' });
System.out.println(baos.toString());
} finally {
baos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}@Synchronized
package demo.other;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import lombok.Synchronized;
/**
* @classDesc: 目前更推荐使用lock对象, 该注解有点鸡肋
* @createTime: 2017年6月23日 下午4:56:20
*/
public class Test_Synchronized {
private DateFormat format = new SimpleDateFormat("MM-dd-YYYY");
@Synchronized
public String synchronizedFormat(Date date) {
return format.format(date);
}
}
// =>相当于
class Test_Synchronized2 {
private final java.lang.Object $lock = new java.lang.Object[0];
private DateFormat format = new SimpleDateFormat("MM-dd-YYYY");
public String synchronizedFormat(Date date) {
synchronized ($lock) {
return format.format(date);
}
}
}
@SneakyThrows
package demo.other;
import lombok.SneakyThrows;
public class Test_SneakyThrows {
// 1. 在不加注解的情况下会抛出异常, 此时需要对异常进行捕获,或者声明抛出
// 该方法包含两个异常
void throw_eeeeeeeeeeeException() throws IllegalAccessException, CloneNotSupportedException {
boolean f1 = true;
if (f1)
throw new IllegalAccessException();
if (f1)
throw new CloneNotSupportedException();
};
// 2. 使用@SneakyThrows后, 不需要声明抛出,或者进行try catch
@SneakyThrows
public void test1() {
throw_eeeeeeeeeeeException();
System.out.println("自动抛出, 调用方会收到到exception");
}
@SneakyThrows(CloneNotSupportedException.class)
public void test2() {
// 3. 由于注解标注了CloneNotSupportedException
// 对不包含的IllegalAccessException 则需要try catch
try {
throw_eeeeeeeeeeeException();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
System.out.println("自动抛出, 调用方会收到到exception");
}
public static void main(String[] args) {
Test_SneakyThrows t = new Test_SneakyThrows();
try {
t.test1();
} catch (Exception e) {
e.printStackTrace();
System.out.println("方法的异常都抛到main里处理");
}
}
}val
package demo.other;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import lombok.val;
public class Test_Val {
public static void main(String[] args) {
val sets = new HashSet<String>();
val lists = new ArrayList<String>();
val maps = new HashMap<String, String>();
// =>相当于
final Set<String> sets2 = new HashSet<String>();
final List<String> lists2 = new ArrayList<String>();
final Map<String, String> maps2 = new HashMap<String, String>();
}
}
@NoArgsConstructor
package demo.constructor;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
@NoArgsConstructor
@RequiredArgsConstructor(staticName = "of")
@AllArgsConstructor
public class LombokDemo {
@NonNull
private int id;
@NonNull
private String shap;
private int age;
public static void main(String[] args) {
// 对应着@NoArgsConstructor
new LombokDemo();
// 对应着@AllArgsConstructor, 包含所有参数
new LombokDemo(1, "circle", 2);
// @NonNull标注的属性如果传入null则会抛出空指针
// @RequiredArgsConstructor需要配合@NonNull使用
new LombokDemo(1, "circle");
// 属性staticName使用静态工厂方法
LombokDemo.of(2, null);
}
}-----
参考:



浙公网安备 33010602011771号