减少你的重复代码-lombok使用教程-idea集成插件

来源:互联网 发布:短信猫群发软件 编辑:程序博客网 时间:2024/06/05 17:12

简介

大部分项目中都必不可少的包含数据库实体(Entity)、数据载体(dto,dataObject),而这两部分都包含着大量的没有业务逻辑的setter、getter、空参构造,同时我们一般要复写类的toString(),equals(),hashCode()方法(贫血模型)。这些工作都是重复性的工作,作为程序员,懒是必备素质之一,这些工作肯定已经有大牛封装好了处理方法,这就是lombok。

idea 安装插件,支持lombok

lombok是在编译阶段才生成相应的代码体,所以在项目中直接调用setter,getter,constructor会报错,这时候可以在IDE安装相应的插件支持lombok。这里介绍idea插件安装,eclipse请自行百度。

安装方法

  1. 进入设置页面(windows:setting,Mac:Preferences)
  2. 点击Plugin
  3. Browse repositories
  4. 搜索lombok
  5. 点击Install
  6. 安装完毕后开启注解权限才能正常使用:
    • –>setting
    • –>Build,Execution,Deployment
    • –>Compiler
    • –>Annontation Processors
    • –>勾选Enable annotation processing
    • –> Apply
  7. 重启Idea

引入方法

gradle

// https://mvnrepository.com/artifact/org.projectlombok/lombokcompile group: 'org.projectlombok', name: 'lombok', version: '1.16.16'

maven

<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok --><dependency>    <groupId>org.projectlombok</groupId>    <artifactId>lombok</artifactId>    <version>1.16.16</version></dependency>

常用方法

@Setter

生成setter方法,final变量不包含

//原始类@Setterpublic class TestEntity {    private String name;    private Integer age;    private final String type = "type";}//反编译的类public class TestEntity {    private String name;    private Integer age;    private final String type = "person";    public TestEntity() {    }    public void setName(String name) {        this.name = name;    }    public void setAge(Integer age) {        this.age = age;    }}

@Getter

生成getter方法,final变量不包含

//原始类@Getterpublic class TestEntity {    private String name;    private Integer age;    private final String type = "person";}//反编译的类public class TestEntity {    private String name;    private Integer age;    private final String type = "person";    public TestEntity() {    }    public String getName() {        return this.name;    }    public Integer getAge() {        return this.age;    }    public String getType() {        this.getClass();        return "person";    }}

@NoArgsConstructor

生成空参构造

//原始类@NoArgsConstructorpublic class TestEntity {    private String name;    private Integer age;    private final String type = "person";}//反编译的类public class TestEntity {    private String name;    private Integer age;    private final String type = "person";    public TestEntity() {    }}

@AllArgsConstructor

生成全部参数构造

//原始类@AllArgsConstructorpublic class TestEntity {    private String name;    private Integer age;    private final String type = "person";}//反编译的类public class TestEntity {    private String name;    private Integer age;    private final String type = "person";    @ConstructorProperties({"name", "age"})    public TestEntity(String name, Integer age) {        this.name = name;        this.age = age;    }}

@RequiredArgsConstructor

将标记为@NoNull的属性生成一个构造器

如果运行中标记为@NoNull的属性为null,会抛出空指针异常。

//原始类@RequiredArgsConstructorpublic class TestEntity {    private String name;    @NonNull    private Integer age;    private final String type = "person";}//反编译的类public class TestEntity {    private String name;    @NonNull    private Integer age;    private final String type = "person";    @ConstructorProperties({"age"})    public TestEntity(@NonNull Integer age) {        if(age == null) {            throw new NullPointerException("age");        } else {            this.age = age;        }    }}

@ToString

生成所有属性的toString()方法

//原始类@ToStringpublic class TestEntity {    private String name;    private Integer age;    private final String type = "person";}//反编译的类public class TestEntity {    private String name;    private Integer age;    private final String type = "person";    public TestEntity() {    }    public String toString() {        StringBuilder var10000 = (new StringBuilder()).append("TestEntity(name=").append(this.name).append(", age=").append(this.age).append(", type=");        this.getClass();        return var10000.append("person").append(")").toString();    }}

@EqualsAndHashCode

生成equals()方法和hashCode方法

//原始类@EqualsAndHashCodepublic class TestEntity {    private String name;    private Integer age;    private final String type = "person";}//反编译的类public class TestEntity {    private String name;    private Integer age;    private final String type = "person";    public TestEntity() {    }    public boolean equals(Object o) {        if(o == this) {            return true;        } else if(!(o instanceof TestEntity)) {            return false;        } else {            TestEntity other = (TestEntity)o;            if(!other.canEqual(this)) {                return false;            } else {                label47: {                    String this$name = this.name;                    String other$name = other.name;                    if(this$name == null) {                        if(other$name == null) {                            break label47;                        }                    } else if(this$name.equals(other$name)) {                        break label47;                    }                    return false;                }                Integer this$age = this.age;                Integer other$age = other.age;                if(this$age == null) {                    if(other$age != null) {                        return false;                    }                } else if(!this$age.equals(other$age)) {                    return false;                }                this.getClass();                String this$type = "person";                other.getClass();                String other$type = "person";                if(this$type == null) {                    if(other$type != null) {                        return false;                    }                } else if(!this$type.equals(other$type)) {                    return false;                }                return true;            }        }    }    protected boolean canEqual(Object other) {        return other instanceof TestEntity;    }    public int hashCode() {        boolean PRIME = true;        byte result = 1;        String $name = this.name;        int result1 = result * 59 + ($name == null?43:$name.hashCode());        Integer $age = this.age;        result1 = result1 * 59 + ($age == null?43:$age.hashCode());        this.getClass();        String $type = "person";        result1 = result1 * 59 + ($type == null?43:$type.hashCode());        return result1;    }}

@Data(常用)

@Data直接修饰POJO or beans, getter所有的变量,setter所有不为final的变量。如果你不需要默认的生成方式,直接填写你需要的annotation的就可以了。默认生成的所有的annotation都是public的,如果需要不同权限修饰符可以使用AccessLevel.NONE选项。当然@Data 也可以使用staticConstructor选项生成一个静态方法。

=@Setter+@Getter+@EqualsAndHashCode+@NoArgsConstructor

//原始类@Datapublic class TestEntity {    @Setter(AccessLevel.PRIVATE)    private String name;    private Integer age;    private final String type = "person";}//反编译的类public class TestEntity {    private String name;    private Integer age;    private final String type = "person";    public TestEntity() {    }    public String getName() {        return this.name;    }    public Integer getAge() {        return this.age;    }    public String getType() {        this.getClass();        return "person";    }    public void setAge(Integer age) {        this.age = age;    }    public boolean equals(Object o) {        if(o == this) {            return true;        } else if(!(o instanceof TestEntity)) {            return false;        } else {            TestEntity other = (TestEntity)o;            if(!other.canEqual(this)) {                return false;            } else {                label47: {                    String this$name = this.getName();                    String 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;                }                Integer this$age = this.getAge();                Integer other$age = other.getAge();                if(this$age == null) {                    if(other$age != null) {                        return false;                    }                } else if(!this$age.equals(other$age)) {                    return false;                }                String this$type = this.getType();                String other$type = other.getType();                if(this$type == null) {                    if(other$type != null) {                        return false;                    }                } else if(!this$type.equals(other$type)) {                    return false;                }                return true;            }        }    }    protected boolean canEqual(Object other) {        return other instanceof TestEntity;    }    public int hashCode() {        boolean PRIME = true;        byte result = 1;        String $name = this.getName();        int result1 = result * 59 + ($name == null?43:$name.hashCode());        Integer $age = this.getAge();        result1 = result1 * 59 + ($age == null?43:$age.hashCode());        String $type = this.getType();        result1 = result1 * 59 + ($type == null?43:$type.hashCode());        return result1;    }    public String toString() {        return "TestEntity(name=" + this.getName() + ", age=" + this.getAge() + ", type=" + this.getType() + ")";    }    private void setName(String name) {        this.name = name;    }}

@Builder

构造Builder模式的结构。通过内部类Builder()进行构建对象。

//原始类@Builderpublic class TestEntity {    private String name;    private Integer age;    private final String type = "person";}//反编译的类public class TestEntity {    private String name;    private Integer age;    private final String type = "person";    @ConstructorProperties({"name", "age"})    TestEntity(String name, Integer age) {        this.name = name;        this.age = age;    }    public static TestEntity.TestEntityBuilder builder() {        return new TestEntity.TestEntityBuilder();    }    public static class TestEntityBuilder {        private String name;        private Integer age;        TestEntityBuilder() {        }        public TestEntity.TestEntityBuilder name(String name) {            this.name = name;            return this;        }        public TestEntity.TestEntityBuilder age(Integer age) {            this.age = age;            return this;        }        public TestEntity build() {            return new TestEntity(this.name, this.age);        }        public String toString() {            return "TestEntity.TestEntityBuilder(name=" + this.name + ", age=" + this.age + ")";        }    }}//Builder模式使用方法@Testpublic  void test(){    TestEntity testEntity = TestEntity.builder()                    .name("java")                    .age(18)                    .build();}

@Value

与@Data相对应的@Value, 两个annotation的主要区别就是如果变量不加@NonFinal ,@Value会给所有的弄成final的。当然如果是final的话,就没有set方法了。

//原始类@Valuepublic class TestEntity {    @Setter(AccessLevel.PRIVATE)    private String name;    private Integer age;    private final String type = "person";}//反编译的类public final class TestEntity {    private final String name;    private final Integer age;    private final String type = "person";    @ConstructorProperties({"name", "age"})    public TestEntity(String name, Integer age) {        this.name = name;        this.age = age;    }    public String getName() {        return this.name;    }    public Integer getAge() {        return this.age;    }    public String getType() {        this.getClass();        return "person";    }    public boolean equals(Object o) {        if(o == this) {            return true;        } else if(!(o instanceof TestEntity)) {            return false;        } else {            TestEntity other;            label44: {                other = (TestEntity)o;                String this$name = this.getName();                String other$name = other.getName();                if(this$name == null) {                    if(other$name == null) {                        break label44;                    }                } else if(this$name.equals(other$name)) {                    break label44;                }                return false;            }            Integer this$age = this.getAge();            Integer other$age = other.getAge();            if(this$age == null) {                if(other$age != null) {                    return false;                }            } else if(!this$age.equals(other$age)) {                return false;            }            String this$type = this.getType();            String other$type = other.getType();            if(this$type == null) {                if(other$type != null) {                    return false;                }            } else if(!this$type.equals(other$type)) {                return false;            }            return true;        }    }    public int hashCode() {        boolean PRIME = true;        byte result = 1;        String $name = this.getName();        int result1 = result * 59 + ($name == null?43:$name.hashCode());        Integer $age = this.getAge();        result1 = result1 * 59 + ($age == null?43:$age.hashCode());        String $type = this.getType();        result1 = result1 * 59 + ($type == null?43:$type.hashCode());        return result1;    }    public String toString() {        return "TestEntity(name=" + this.getName() + ", age=" + this.getAge() + ", type=" + this.getType() + ")";    }}

@Synchronized

同步方法

//原始类public class TestEntity {    private String name;    private Integer age;    private final String type = "person";    @Synchronized    public void write(){        //do something    }}//反编译的类public class TestEntity {    private final Object $lock = new Object[0];    private String name;    private Integer age;    private final String type = "person";    public TestEntity() {    }    public void write() {        Object var1 = this.$lock;        synchronized(this.$lock) {            ;        }    }}

@Cleanup @@SneakyThrows

自动调用close方法关闭资源。

//原始类public class TestEntity {    private String name;    private Integer age;    private final String type = "person";    @SneakyThrows    public  void  outputStream(){         @Cleanup OutputStream outputStream = new FileOutputStream(new File("/Users/hello"));    }}//反编译的类public class TestEntity {    private String name;    private Integer age;    private final String type = "person";    public TestEntity() {    }    public void outputStream() {        try {            FileOutputStream $ex = new FileOutputStream(new File("/Users/hello"));            if(Collections.singletonList($ex).get(0) != null) {                $ex.close();            }        } catch (Throwable var2) {            throw var2;        }    }}
1 0
原创粉丝点击