ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

lombok之美

2020-01-01 21:55:42  阅读:224  来源: 互联网

标签:String age 之美 private sex Integer lombok public


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

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

标签:String,age,之美,private,sex,Integer,lombok,public
来源: https://www.cnblogs.com/z-qinfeng/p/12130212.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有