【IDEA】开发效率插件Lombok、GenerateAllSetter

在创建对象实体类时,是不是还在为set和get方法烦恼? 虽然可以通过快捷键生成get和set方法,但是如果对象实体类中的属性比较多时,加上set和get方法,代码会显的很长,lombook插件可以帮我们进行简化代码。

lombok 提供了简单的注解的形式来帮助我们简化消除一些必须有但显得很臃肿的 java 代码。通过使用对应的注解,可以在编译源码的时候生成对应的方法,所以不会影响任何运行效率。

1、Lombook插件

1、maven项目lombook插件的依赖

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.20</version>
        </dependency>

Lombok只在编译阶段生效,不需要打入包中。可以将项目clean install后,在target目录中查看到编译的该类,该类中包含使用set和get注解带有的代码。

2、IDE添加对lombook插件的支持

以开发工具idea在线安装为例,安装完插件后。

image-20200323171528937

3、lombook注解

常用的 lombok 注解:

@Data   :注解在类上;包含了@ToString,@EqualsAndHashCode,@Getter / @Setter和@RequiredArgsConstructor的功能,提供类所有属性的 getter 和 setter 方法,此外还提供了equals、canEqual、hashCode、toString 方法

@Setter:注解在属性上;为属性提供 setter 方法

@Getter:注解在属性上;为属性提供 getter 方法

@ToString:注解在类上;生成toString()方法,默认情况下,它会按顺序(以逗号分隔)打印你的类名称以及每个字段。可以这样设置不包含哪些字段@ToString(exclude = "id") / @ToString(exclude = {"id","name"})

如果继承的有父类的话,可以设置callSuper 让其调用父类的toString()方法,例如:@ToString(callSuper = true)

@EqualsAndHashCode:注解在类上;生成hashCode()和equals()方法,默认情况下,它将使用所有非静态,非transient字段。但可以通过在可选的exclude参数中来排除更多字段。或者,通过在parameter参数中命名它们来准确指定希望使用哪些字段。

@NonNull:  注解在属性上;标识属性是不能为空,为空则抛出异常。

@Slf4j :注解在类上;根据用户实际使用的日志框架生成log日志对象。

@Log4j :注解在类上;为类提供一个 属性名为log 的 log4j 日志对象

@NoArgsConstructor:注解在类上;为类提供一个无参的构造方法。当类中有final字段没有被初始化时,编译器会报错,此时可用@NoArgsConstructor(force = true),然后就会为没有初始化的final字段设置默认值 0 / false / null。对于具有约束的字段(例如@NonNull字段),不会生成检查或分配,因此请注意,正确初始化这些字段之前,这些约束无效。

@AllArgsConstructor:注解在类上;为类提供一个全参的构造方法

默认生成的方法是public的,如果要修改方法修饰符可以设置AccessLevel的值,例如:@Getter(access = AccessLevel.PROTECTED)

@RequiredArgsConstructor:注解在类上;会生成构造方法(可能带参数也可能不带参数),如果带参数,这参数只能是以final修饰的未经初始化的字段,或者是以@NonNull注解的未经初始化的字段@RequiredArgsConstructor(staticName = "of")会生成一个of()的静态方法,并把构造方法设置为私有的。


4、常用注解

Getter和Setter注解,提供set和get方法。注解使用示例:

package com.code.study.example.entity;

import lombok.Getter;
import lombok.Setter;

/**
 * @author: MWL
 * @date: 2020/3/23 5:03 下午
 **/
@Getter
@Setter
public class Student {
    private String name;
    private String userId;
    private int top;
    private float score;
    private boolean isGraduate;
}

使用Getter和Setter注解,为该类中的所有属性生成set和get方法,我们可以在Structure视图中,看到对应的方法(Mac键盘快捷键Command+7显示该类Structure视图),如下所示:
在这里插入图片描述

@ToString注解,作用于类,覆盖默认的toString()方法,可以通过exclude属性排除某些字段。

@Getter
@Setter
@ToString( exclude = {"score"})
public class Student {

    private String name;
    private String userId;
    private int top;
    private float score;
    private boolean isGraduate;
}

//程序运行结果:Student(name=mwl, userId=sa323, top=1, isGraduate=false)

@NoArgsConstructor, @AllArgsConstructor: 作用于类上,用于生成无参和全参构造函数。

@Builder: 作用于类上,将类转变为建造者模式

@Log: 作用于类上,生成日志变量,变量名为log。

//log变量等同于以下代码,和logger同样效果,一般用于日志打印:
private static final Logger logger = LoggerFactory.getLogger(Student.class);
package com.code.study.example.entity;

import lombok.*;
import lombok.extern.slf4j.Slf4j;

/**
 * @author: MWL
 * @date: 2020/3/23 5:03 下午
 **/
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
@ToString( exclude = {"score"}) //没有exclude属性,默认打印对象全部属性
@Slf4j

public class Student {

    //使用@Slf4j注解后log与logger变量效果一样  由于没有引入相关依赖   下行代码会报错
    private static final Logger logger = LoggerFactory.getLogger(Student.class);

    private String name;
    private String userId;
    private int top;
    private float score;
    private boolean isGraduate;
    private final String str = "Test";

    public static void main(String[] args) {
        Student stu = new Student();
        stu.setName("mwl");
        stu.setUserId("sa323");
        stu.setTop(1);
        stu.setScore(11.2F);
        stu.setGraduate(false);
        //排除isGraduate属性 打印
        System.out.println(stu.toString());

        //包含全部参数的构造器
        Student stu1 = new Student("a","b",12,23.f,false);
        System.out.println(stu1.toString());

        //建造者模式对对象属性设值
        Student stu2 = Student.builder()
                .name("test")
                .userId("idTest")
                .top(22)
                .score(9.9f)
                .isGraduate(false)
                .build();
        System.out.println(stu2.toString());
        
    }
}

顺便再推荐一个插件,GenerateAllSetter,该插件作用是可以快速针对已有的model实体对象的属性生产set代码,免去开发者在开发过程中set属性值时还需要去实体对象中翻查的时间,生成的同时会附带类型默认值。新建一个对象,然后选中对象(在mac下使用快捷键 option+回车 可生成对象中的所有set语句,也可选择)

image-20200323175903101

代码全部实例:

package com.code.study.example.entity;

import lombok.*;
import lombok.extern.slf4j.Slf4j;

/**
 * @author: MWL
 * @date: 2020/3/23 5:03 下午
 **/
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
@ToString( exclude = {"score"}) //没有exclude属性,默认打印对象全部属性
@Slf4j

public class Student {

    //使用@Slf4j注解后log与logger变量效果一样  由于没有引入相关依赖   下行代码会报错
    private static final Logger logger = LoggerFactory.getLogger(Student.class);

    private String name;
    private String userId;
    private int top;
    private float score;
    private boolean isGraduate;
    private final String str = "Test";

    public static void main(String[] args) {
        Student stu = new Student();
        stu.setName("mwl");
        stu.setUserId("sa323");
        stu.setTop(1);
        stu.setScore(11.2F);
        stu.setGraduate(false);
        //排除isGraduate属性 打印
        System.out.println(stu.toString());

        //包含全部参数的构造器
        Student stu1 = new Student("a","b",12,23.f,false);
        System.out.println(stu1.toString());

        //建造者模式对对象属性设值
        Student stu2 = Student.builder()
                .name("test")
                .userId("idTest")
                .top(22)
                .score(9.9f)
                .isGraduate(false)
                .build();
        System.out.println(stu2.toString());


        Student stu3 = new Student();
        //选中对象(即选中Student),使用option+回车键 可生成如下代码
        stu3.setName("");
        stu3.setUserId("");
        stu3.setTop(0);
        stu3.setScore(0.0F);
        stu3.setGraduate(false);

    }
}

rainbow brackets插件用于对括号标记不同颜色,防止代码中缺少左右括号造成的困扰。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章