Lombok常用注解解析「简化Java各种简单对象的模板代码」

目录

 

一 IDE语法支持

二 添加Maven依赖

三 常用注解解析

简单注解

@Getter

@Setter

@ToString

@EqualsAndHashCode

@NoArgsConstructor

@AllArgsConstructor

@Cleanup

@NonNull

@val

@var

简单注解组合

@Data

@Value

日志注解

@Log

@CommonsLog

@Log4j

@Log4j2

@Slf4j

构造器注解

@Builder

@Singular

提供了但是功能很软肋的注解

@RequiredArgsConstructor

@Synchronized

@SneakyThrows


一 IDE语法支持

为了让IDE能支持Lombok,需要安装IDE插件,以Mac IDEA为例,打开设置界面: 

 点击Brow repositories,搜索Lombok

安装完后,重启IDE即可。

二 添加Maven依赖

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.4</version>
            <scope>provided</scope>
        </dependency>

三 常用注解解析

简单注解:@Getter @Setter @ToString @EqualsAndHashCode @NoArgsConstructor @AllArgsConstructor @Cleanup @NonNull

  @val @var

简单注解组合:@Data @Value

日志注解:@Log @CommonsLog @Log4j @Log4j2 @Slf4j

构造器注解:@Builder @Singular

提供了但是功能很软肋的注解:@RequiredArgsConstructor @Synchronized @SneakyThrows

简单注解

@Getter

可以用在类和类属性上面,当用在类上面表示自动生成全部属性的get方法,当用属性上面表示自动生成对应属性的get方法。

这里仅演示注解在属性的示例:

public class GetterTest {

    @Getter
    private String name = "涂有";

    private String age;

    public static void main(String[] args) {
        var getterTest = new GetterTest();
        System.out.println(getterTest.getName());

    }
}

 自动生成的字节码反编译代码:

public class GetterTest {
    private String name = "涂有";
    private String age;

    public GetterTest() {
    }

    public static void main(String[] args) {
        GetterTest getterTest = new GetterTest();
        System.out.println(getterTest.getName());
    }

    public String getName() {
        return this.name;
    }
}

@Setter

和@Getter注解使用方法一样,自动生成对应的set方法,这里不做过多解释

@ToString

注解在类上面,自动生成toString方法,不打印静态属性,ToString.includeFieldNames属性表示是否打印属性名称(默认true),ToString.exclude表示哪些属性不打印,ToString.callSuper表示是否打印父类属性(默认false),其他的属性请求自行查阅源码

@ToString
public class ToStringTest {

    private int age = 100;
    private String name = "涂有";
}

自动生成的字节码反编译代码:

public class ToStringTest {
    private int age = 100;
    private String name = "涂有";

    public ToStringTest() {
    }

    public String toString() {
        return "ToStringTest(age=" + this.age + ", name=" + this.name + ")";
    }
}

@EqualsAndHashCode

作用于类上,自动生成equals和hashCode方法

@NoArgsConstructor

作用于类上,自动生成无参构造函数

@AllArgsConstructor

作用于类上,自动生成全部参数的构造函数,但是这样会覆盖掉隐式无参构造函数,和我们直接编写有参构造函数一样,也会覆盖隐式无参构造函数

@Cleanup

作用于局部变量,会自动关闭实现Closeable接口的变量

        @Cleanup InputStreamReader sr = new InputStreamReader(System.in);
        char c = 0;
        while ((c = (char)sr.read()) != 0) {
            System.out.println(c);
        }

自动生成的字节码反编译代码:

try {
            InputStreamReader sr = new InputStreamReader(System.in);

            try {
                boolean var4 = false;

                char c;
                while((c = (char)sr.read()) != 0) {
                    System.out.println(c);
                }
            } finally {
                if (Collections.singletonList(sr).get(0) != null) {
                    sr.close();
                }

            }
        } catch (IOException var9) {
            var9.printStackTrace();
        }

@NonNull

检测变量是否为空,如果为空自动抛出NullPointException,作用于属性、方法参数、方法返回类型、本地变量,但是我发现只有写在方法参数上才起作用

@val

作用于局部常量,自动推算常量类型

    public static void main(String[] args) {
        val name = "tuyou";
        //name = "tuyou2"; //编译报错
    }

@var

作用于局部变量,自动推算变量类型

    public static void main(String[] args) {
        var name = "tuyou";
        name = "tuyou2";
    }

简单注解组合

@Data

作用于类,是@Getter @Setter @RequiredArgsConstructor @ToString @EqualsAndHashCode组合

@Value

作用于类,是@Getter @AllArgsConstructor @ToString @EqualsAndHashCode的组合

日志注解

注意:在项目根目录下面创建lombok.config,并配置:

lombok.log.fieldName=LOGGER

可以修改自动生成的日志变量名称。

@Log

作用于类,自动为类生成一个日志变量,方便直接用。

@Log
public class LogTest {

    public static void main(String[] args) {

        log.info("日志");
    }
}

@CommonsLog

同上

@Log4j

同上

@Log4j2

同上

@Slf4j

同上

构造器注解

@Builder

这个类型和Builder(构造器)设计模式对应,自动为类实现Builder模式

@Data
@Builder
public class BuilderTest {

    private String name;
    private int age;

    public static void main(String[] args) {

        BuilderTest obj = BuilderTest.builder().name("涂有").age(25).build();
        System.out.println(obj);
    }
}

@Singular

配合@Builder使用,作用于集合属性,为集合属性提供add方法

@Data
@Builder
public class BuilderTest {

    private String name;

    private int age;

    @Singular("addAddress")
    private List<String> address;

    public static void main(String[] args) {

        BuilderTest obj = BuilderTest.builder().name("涂有").age(25).addAddress("chengdu").build();
        System.out.println(obj);
    }
}

提供了但是功能很软肋的注解

@RequiredArgsConstructor

自动为final属性和@NonNull的属性添加构造函数,不好控制,不好用

@Synchronized

作用于方法,把方法变成一个同步方法,还不如直接写synchronized可读性强

@SneakyThrows

作用于方法和构造函数,隐式抛出异常,还不如直接写throws可读性强

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值