1.定义一个Bean

public class UserDO {
    private Integer id;
    private String userName;
    private String sex;
    private Integer age;

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }
}

定义了一个UserDO, 类中提供了属性的setter,setter方法. 这么多的setter ,getter方法,看起来是不是很蛋疼, lombok可以帮我们优化.

 

2. lombok的基本功能

@Setter
@Getter
public class UserDO {
    private Integer id;
    private String userName;
    private String sex;
    private Integer age;
}

看到没有,仅仅使用@Setter, @Getter两个注解,就帮我们干掉了繁人的getter,setter方法, 是不是很强大. 

但是仅仅是@Setter, @Getter两个注解还是不能体现出lombok的强大, 我们完全可以使用@Data一个注解去替换@Setter和@Getter

代码如下

import lombok.Data;
@Data
public class UserDO {
    private Integer id;
    private String userName;
    private String sex;
    private Integer age;
}

 

当然,lombok除了对getter,setter方法做了优化之外,还对构造器做了定义

@Data
@AllArgsConstructor // 全参构造器
@NoArgsConstructor  // 无参构造器
public class UserDO {
    private Integer id;
    private String userName;
    private String sex;
    private Integer age;
}

 

3. 链式编程

public class UserDO {
    private Integer id;
    private String userName;
    private String sex;
    private Integer age;

    public Integer getId() {
        return id;
    }

    public UserDO setId(Integer id) {
        this.id = id;
        return this;
                
    }

    public String getUserName() {
        return userName;
    }

    public UserDO setUserName(String userName) {
        this.userName = userName;
        return this;
    }

    public String getSex() {
        return sex;
    }

    public UserDO setSex(String sex) {
        this.sex = sex;
        return this;
    }

    public Integer getAge() {
        return age;
    }

    public UserDO setAge(Integer age) {
        this.age = age;
        return this;
    }
}

使用链式编程, 我们可这样操作

UserDO userDO = new UserDO();
userDO.setUserName("郑钦锋").setAge(215).setId(1).setSex("男");

上述的链式编程,看起来肯定比传统的set属性值要优雅一点吧.

而lombok正好也为我们提供了链式编程功能, 仅须添加@Accessors(chain = true)注解即可.

@Accessors(chain = true)
@Data
public class UserDO {
    private Integer id;
    private String userName;
    private String sex;
    private Integer age;
}

测试

public class UserDOTest {
    public static void main(String[] args) {
        UserDO userDO = new UserDO();
        userDO.setUserName("郑钦锋").setAge(215).setId(1).setSex("男");
        System.out.println(userDO);  //UserDO(id=1, userName=郑钦锋, sex=男, age=215)
    }
}

是不是很赞!

 

4. 创建实例 

通过new的方式创建一个实例是不是有点不显逼格.

guava中创建List集合可以使用以下这种方式

List<String> list = Lists.newArrayList();

刚好,lombok也提供了类似的功能,请看

import lombok.Data;
import lombok.RequiredArgsConstructor;
import lombok.experimental.Accessors;

@Accessors(chain = true)
@Data
// 通过@RequiredArgsConstructor注解创建实例
@RequiredArgsConstructor(staticName = "of")
public class UserDO {
    private Integer id;
    private String userName;
    private String sex;
    private Integer age;
}

测试代码 

public class UserDOTest {
    public static void main(String[] args) {
        UserDO userDO = UserDO.of().setUserName("郑钦锋").setSex("男");
        UserDO userDO1 = UserDO.of().setUserName("郑钦锋").setSex("男").setId(1);
        System.out.println(userDO.hashCode());
        System.out.println(userDO1.hashCode());  
        System.out.println(userDO == userDO1); // false
        System.out.println(userDO);
        System.out.println(userDO1);
    }
}

直接通过类名.of()就创建了一个实例!

 

5. builder模式

对于复杂对象的创建, 我们一般都会使用builder设计模式,请看示例

public class UserDO {
    private Integer id;
    private String userName;
    private String sex;
    private Integer age;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public static Builder builder() {
        return new Builder();
    }

    public static class Builder {
        private Integer id;
        private String userName;
        private String sex;
        private Integer age;

        public Builder userName(String userName) {
            this.userName = userName;
            return this;
        }


        public Builder id(Integer id) {
            this.id = id;
            return this;
        }

        public Builder age(Integer age) {
            this.age = age;
            return this;
        }

        public Builder sex(String sex) {
            this.sex = sex;
            return this;
        }
        public UserDO build() {
            UserDO userDO = new UserDO();
            userDO.setId(id);
            userDO.setAge(age);
            userDO.setSex(sex);
            userDO.setUserName(userName);
            return userDO;
        }
    }

    @Override
    public String toString() {
        return "UserDO{" +
                "id=" + id +
                ", userName='" + userName + '\'' +
                ", sex='" + sex + '\'' +
                ", age=" + age +
                '}';
    }
}

测试代码

public class UserDOTest {
    public static void main(String[] args) {
        UserDO userDO = UserDO.builder().id(1).userName("郑钦锋").age(13).sex("hfdk").build();
        System.out.println(userDO); //UserDO{id=1, userName='郑钦锋', sex='hfdk', age=13}
    }
}

Builder类中的代码之复杂,一看就明白. lombok对些做了优化, 使用起来很简单. 请看示例

import lombok.Builder;
import lombok.ToString;

@ToString // 方便打印
@Builder
public class UserDO {
private Integer id;
private String userName;
private String sex;
private Integer age;
}
 

测试代码 

public class UserDOTest {
    public static void main(String[] args) {
        UserDO userDO = UserDO.builder().id(1).userName("郑钦锋").age(13).sex("hfdk").build();
        System.out.println(userDO); //UserDO(id=1, userName=郑钦锋, sex=hfdk, age=13)
    }
}

一个@Builder注解替换了一大段代码, 你说牛逼不牛逼 

 

6. 代理模式

先来一个原始的代码实现 

public interface UserOperations {
     void eat() throws Exception;
     void drink() throws Exception;
}

 

/**
 * 真正干事的类
 */
public class RealOperations {
    public void eat() throws Exception {
        System.out.println("吃饭!");
    }

    public void drink() throws Exception {
        System.out.println("喝水!");
    }
}

 

/**
 * 代理类
 */
public abstract class DelegateOperations implements UserOperations {
    private RealOperations realOperations;

    /**
     * 通过构造器传参
     *
     * @param realOperations
     */
    protected DelegateOperations(RealOperations realOperations) {
        this.realOperations = realOperations;
    }

    @Override
    public void eat() throws Exception {
        realOperations.eat();
    }

    @Override
    public void drink() throws Exception {
        realOperations.drink();
    }
}

 

public class XiaoMingOperation extends DelegateOperations {
    public XiaoMingOperation(RealOperations realOperations) {
        super(realOperations);
    }
}

 

测试代码

public class Test {
    public static void main(String[] args) throws Exception {
        RealOperations realOperations = new RealOperations();
        XiaoMingOperation xiaoMingOperation = new XiaoMingOperation(realOperations);
        xiaoMingOperation.eat();
        xiaoMingOperation.drink();
    }
}

 

上述代码代理类 DelegateOperations是不是屁事都没有做, 如果 UserOperations 接口中方法很多, 那么DelegateOperations的实现是不是很烦人. lombok可以帮我们简单代码.请看下面代码 

/**
 * 代理类
 */
@AllArgsConstructor
public abstract class DelegateOperations implements UserOperations {
    @Delegate
    private RealOperations realOperations;
}

两个注解搞定, 代码看起来是不是清爽很多. 经测试,完全没有毛病.

posted on 2020-01-01 21:46  显示账号  阅读(286)  评论(0编辑  收藏  举报