使用lombok简化代码

举例

image

代码清单

对应代码

@Getter @Setter     demo.data.Person
@NonNull           demo.other.Test_nonNull
@ToString          demo.data.SuperMan
@EqualsAndHashCode   demo.EqualsAndHashCode.Person

@Data == @ToString, @EqualsAndHashCode, @Getter
@Value == 不可变版本的@Data 不提供set方法
 
@Builder            demo.data.Test_Builder

@Cleanup            demo.other.Test_Cleanup
@Synchronized       demo.other.Test_Synchronized
@SneakyThrows       demo.other.Test_SneakyThrows

val: 定义final变量          demo.other.Test_Val


@NoArgsConstructor     demo.constructor.LombokDemo
@RequiredArgsConstructor
@AllArgsConstructor


@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;
}

image


@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);
    }
}

-----


参考:

http://blog.didispace.com/java-lombok-1/

http://www.cnblogs.com/ywqbj/p/5711691.html

posted @ 2017-06-07 19:25  fluffy  阅读(427)  评论(3)    收藏  举报