zoukankan      html  css  js  c++  java
  • 终极CRUD-2-用lombok提高开发效率

    1 lom介绍与基本使用

    https://zhuanlan.zhihu.com/p/32779910

    lombok概念和基本使用,看这一篇就足够了

    2 lombok 注意点

    2.1 lombok自动生成方法可以混合自己写的方法

    ​ 见以下代码

    @Getter
    @Setter
    public class FishermanDemo {
    
        private String username;
        private Integer time;
    
        public String getUsername(){
            System.out.println("hello world");
            return "hello username";
        }
    
        public void setTime(Integer time){
            System.out.println("hello time");
            this.time = time;
        }
    }
    

    编译后的class文件

    public class FishermanDemo {
        private String username;
        private Integer time;
    
        public FishermanDemo() {
        }
    
        public String getUsername() {
            System.out.println("hello world");
            return "hello username";
        }
    
        public void setTime(Integer time) {
            System.out.println("hello time");
            this.time = time;
        }
    
        public Integer getTime() {
            return this.time;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    }
    

    我们可以看出,lombok编译后的代码不会覆盖我们自己写的getter/setter方法。一般情况下,我们不会自己写getter/setter方法,但是也有些特殊的地方。比如POJO对象如果有时间类型,并且保存的类型和数据库字段不一致,那么这个时候就需要自己定义该时间类型的getter/setter方法,因为像Mybatis这样的框架是通过getter/setter方法来获取和注入值的。

    2.2 尽量不要使用@Data

    我们看源文件

    @Data
    public class FishermanDemo {
    
        private String username;
        private Integer time;
    
    }
    

    反编译后的文件

    public class FishermanDemo {
        private String username;
        private Integer time;
    
        public FishermanDemo() {
        }
    
        public String getUsername() {
            return this.username;
        }
    
        public Integer getTime() {
            return this.time;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    
        public void setTime(Integer time) {
            this.time = time;
        }
    
        public boolean equals(Object o) {
            if (o == this) {
                return true;
            } else if (!(o instanceof FishermanDemo)) {
                return false;
            } else {
                FishermanDemo other = (FishermanDemo)o;
                if (!other.canEqual(this)) {
                    return false;
                } else {
                    Object this$username = this.getUsername();
                    Object other$username = other.getUsername();
                    if (this$username == null) {
                        if (other$username != null) {
                            return false;
                        }
                    } else if (!this$username.equals(other$username)) {
                        return false;
                    }
    
                    Object this$time = this.getTime();
                    Object other$time = other.getTime();
                    if (this$time == null) {
                        if (other$time != null) {
                            return false;
                        }
                    } else if (!this$time.equals(other$time)) {
                        return false;
                    }
    
                    return true;
                }
            }
        }
    
        protected boolean canEqual(Object other) {
            return other instanceof FishermanDemo;
        }
    
        public int hashCode() {
            int PRIME = true;
            int result = 1;
            Object $username = this.getUsername();
            int result = result * 59 + ($username == null ? 43 : $username.hashCode());
            Object $time = this.getTime();
            result = result * 59 + ($time == null ? 43 : $time.hashCode());
            return result;
        }
    
        public String toString() {
            return "FishermanDemo(username=" + this.getUsername() + ", time=" + this.getTime() + ")";
        }
    }
    

    我们可以看到 反编译后的文件有 getter/setter、无参构造器、equal、hascode、toString。我们经常使用的POJO对象一般只有getter/setter、无参构造器、有参数构造器、toString。因此我们可以用以下5个注解。

    @Setter
    @Getter
    @NoArgsConstructor
    @AllArgsConstructor
    @ToString
    

    2.3 属性不要使用基本类型

    这个属于POJO对象基本约束规范,不要使用基本数据类型。

    lombok对基本数据类型boolean反编译后的结果和Boolean类型有一些不一致。

    假设private boolean sex, boolean基本类型sex的getter/setter方法如下,isSex和setSex,而Boolean就是正常的getSex和setSex

    2.4 小心@ToString

    使用lombok的注解 @ToString 打印出来的结果如下:

    Student(name=Mahesh, age=21) // name后面的值  没有''
    

    而使用IDEA 自动生成的toString方法 打印出来的结果如下:

    Student{name='Mahesh', age=21} // name 后面的值 有''
    

    可以看出来,IDEA自动生成的ToString方法,如果属性是字符串,那么调用toString方法的时候,会比lombok的toString方法多一个 ''

    3 lombok 缺陷

    使用lombok有一个最大的缺陷,就是在团队中所有开发人员都需要安装相关的lombok插件

    4 lombok 底层原理

    lombok很神奇,很我们以往使用jar包完全不一样,它必须要求开发工具安装相应的jar包,原因就是跟lombok底层实现原理有很大的关系。

    lombok利用JSR269 api(Pluggable Annotation Processing API )创建编译期的注解处理器,注意所有的@Getter、@Setter、@Data、@ToString方法都是编译期注解 @Retention(RetentionPolicy.SOURCE)

    这跟springboot等在运行期间利用反射获取注解相关的值完全不一样。而lombok能够在编译期就完成这些不可思议的工作,完全是因为JSR269的规范,允许在编译时指定一个processor类来对编译阶段的注解进行干预。

    简单一句话,通过JSR269规范,允许你对一个类,在编译期间进行相应的更改,比如增加一些方法。

    因此相关的开发工具例如IDEA、Eclipse完全不知道这些方法的存在

    @Getter
    public class FishermanDemo {
        private String username;
    }
    

    反编译后的class文件

    public class FishermanDemo {
        private String username;
    
        public FishermanDemo() {
        }
    
        public String getUsername() {
            return this.username;
        }
    }
    

    如果这个时候直接调用getUsername()

    FishermanDemo fishermanDemo = new FishermanDemo();
    fishermanDemo.getUsername();
    

    开发工具的编译期会报错,因为他们完全不知道getUsername()方法的存在,因此必须安装相关的lombok插件,才能使开发工具不报错。


    参考资料: https://blog.mythsman.com/2017/12/19/1/#more https://zhuanlan.zhihu.com/p/32779910
    作者:一杯热咖啡AAA
    出处:https://www.cnblogs.com/AdaiCoffee/
    本文以学习、研究和分享为主,欢迎转载。如果文中有不妥或者错误的地方还望指出,以免误人子弟。如果你有更好的想法和意见,可以留言讨论,谢谢!
  • 相关阅读:
    JavaScript常用函数和方法
    Django中csrf错误
    LVS+Keepalived负载均衡配置
    CSP-S2019 游记
    三角函数公式整理
    LGOJP3193 [HNOI2008]GT考试
    BZOJ3790. 神奇项链
    BZOJ4241: 历史研究
    LGOJP2051 [AHOI2009]中国象棋
    AT2000 Leftmost Ball
  • 原文地址:https://www.cnblogs.com/AdaiCoffee/p/10848161.html
Copyright © 2011-2022 走看看