zoukankan      html  css  js  c++  java
  • lombok常用注解@Data@AllArgsConstructor@NoArgsConstructor@Builder@Accessors

    原贴:https://blog.csdn.net/ChenXvYuan_001/article/details/84961992

       https://blog.csdn.net/weixin_38229356/article/details/82937420

    @Data
    使用这个注解,就不用再去手写Getter,Setter,equals,canEqual,hasCode,toString等方法了,注解后在编译时会自动加进去。

    @AllArgsConstructor
    使用后添加一个构造函数,该构造函数含有所有已声明字段属性参数

    @NoArgsConstructor
    使用后创建一个无参构造函数

    @Builder
    关于Builder较为复杂一些,Builder的作用之一是为了解决在某个类有很多构造函数的情况,也省去写很多构造函数的麻烦,在设计模式中的思想是:用一个内部类去实例化一个对象,避免一个类出现过多构造函数。

    然后,通过一个简单的代码例子说明:

    1)首先,建立一个简单的类,并用lombok进行注解:注意这是注解前的代码,可以与后面贴出的注解生成的代码进行比较:

    @Data //生成getter,setter等函数
    @AllArgsConstructor //生成全参数构造函数
    @NoArgsConstructor//生成无参构造函数
    @Builder
    public class test1 {
        String name;
        String age;
        String sex;
    }

    2)测试入口:

     public static void main(String[] args) {
     //使用@Builder注解后,可以直接通过Builder设置字段参数
            test1 t1=new test1.test1Builder()
                    .name("wang")
                    .age("12")
                    .sex("man")
                    .build();
    
            System.out.println("name is"+t1.getName()+'
    '+"age is :"+t1.getAge());
    
        }

    3)通过查看编译后的类,比较注解前后的代码量,发现会省去了很多代码的书写:

    public class test1 {
        String name;
        String age;
        String sex;
    
        public static test1.test1Builder builder() {
            return new test1.test1Builder();
        }
    
        public String getName() {
            return this.name;
        }
    
        public String getAge() {
            return this.age;
        }
    
        public String getSex() {
            return this.sex;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public void setAge(String age) {
            this.age = age;
        }
    
        public void setSex(String sex) {
            this.sex = sex;
        }
    
        public boolean equals(Object o) {
            if (o == this) {
                return true;
            } else if (!(o instanceof test1)) {
                return false;
            } else {
                test1 other = (test1)o;
                if (!other.canEqual(this)) {
                    return false;
                } else {
                    label47: {
                        Object this$name = this.getName();
                        Object other$name = other.getName();
                        if (this$name == null) {
                            if (other$name == null) {
                                break label47;
                            }
                        } else if (this$name.equals(other$name)) {
                            break label47;
                        }
    
                        return false;
                    }
    
                    Object this$age = this.getAge();
                    Object other$age = other.getAge();
                    if (this$age == null) {
                        if (other$age != null) {
                            return false;
                        }
                    } else if (!this$age.equals(other$age)) {
                        return false;
                    }
    
                    Object this$sex = this.getSex();
                    Object other$sex = other.getSex();
                    if (this$sex == null) {
                        if (other$sex != null) {
                            return false;
                        }
                    } else if (!this$sex.equals(other$sex)) {
                        return false;
                    }
    
                    return true;
                }
            }
        }
    
        protected boolean canEqual(Object other) {
            return other instanceof test1;
        }
    
        public int hashCode() {
            int PRIME = true;
            int result = 1;
            Object $name = this.getName();
            int result = result * 59 + ($name == null ? 43 : $name.hashCode());
            Object $age = this.getAge();
            result = result * 59 + ($age == null ? 43 : $age.hashCode());
            Object $sex = this.getSex();
            result = result * 59 + ($sex == null ? 43 : $sex.hashCode());
            return result;
        }
    
        public String toString() {
            return "test1(name=" + this.getName() + ", age=" + this.getAge() + ", sex=" + this.getSex() + ")";
        }
    
        @ConstructorProperties({"name", "age", "sex"})
        public test1(String name, String age, String sex) {
            this.name = name;
            this.age = age;
            this.sex = sex;
        }
    
        public test1() {
        }
    
        public static class test1Builder {
            private String name;
            private String age;
            private String sex;
    
            test1Builder() {
            }
    
            public test1.test1Builder name(String name) {
                this.name = name;
                return this;
            }
    
            public test1.test1Builder age(String age) {
                this.age = age;
                return this;
            }
    
            public test1.test1Builder sex(String sex) {
                this.sex = sex;
                return this;
            }
    
            public test1 build() {
                return new test1(this.name, this.age, this.sex);
            }
    
            public String toString() {
                return "test1.test1Builder(name=" + this.name + ", age=" + this.age + ", sex=" + this.sex + ")";
            }
        }
    }

    @Accessors
    Accessor的中文含义是存取器,@Accessors用于配置getter和setter方法的生成结果,下面介绍三个属性

    fluent
    fluent的中文含义是流畅的,设置为true,则getter和setter方法的方法名都是基础属性名,且setter方法返回当前对象。

    @Data
    @Accessors(fluent = true)
    public class User {
        private Long id;
        private String name;
        
        // 生成的getter和setter方法如下,方法体略
        public Long id() {}
        public User id(Long id) {}
        public String name() {}
        public User name(String name) {}
    }  

    chain
    chain的中文含义是链式的,设置为true,则setter方法返回当前对象。

     public static void main(String[] args) {
     //使用@Builder注解后,可以直接通过Builder设置字段参数
            test1 t1=new test1.test1Builder()
                    .name("wang")
                    .age("12")
                    .sex("man")
                    .build();
    
            System.out.println("name is"+t1.getName()+'
    '+"age is :"+t1.getAge());
    
        }

    prefix
    prefix的中文含义是前缀,用于生成getter和setter方法的字段名会忽视指定前缀(遵守驼峰命名)。

    @Data
    @Accessors(prefix = "p")
    class User {
        private Long pId;
        private String pName;
        
        // 生成的getter和setter方法如下,方法体略
        public Long getId() {}
        public void setId(Long id) {}
        public String getName() {}
        public void setName(String name) {}
    }
  • 相关阅读:
    数字黑洞
    剪刀石头布
    A除以B
    【Java3】打印三角形
    Servlet 之 javax.servlet 包
    关键字之Super
    设计模式之单例模式
    Servlet 之 读取读取 HTTP 头
    static之类方法和实例方法的区别
    Lambda之通过“方法引用”让你的Lambda表达式更加简洁
  • 原文地址:https://www.cnblogs.com/penghq/p/12055483.html
Copyright © 2011-2022 走看看