Lombok入门 -002- 注解

一、添加依赖

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

二、官网文档

https://projectlombok.org/features/all

三、常用注解

@Cleanup

@Cleanup InputStream in = new FileInputStream("some/file");

当代码加上该注解后,程序会在in的作用域最末尾调用 in.close()。此调用保证通过 try/finally 构造运行。如果您要清理的对象类型没有close()方法,但有其他一些无参数方法,则可以像这样指定此方法的名称:

@Cleanup("dispose") org.eclipse.swt.widgets.CoolBar bar = 
new CoolBar(parent, 0);

以下两段代码作用等同

import lombok.Cleanup;

import java.io.*;

public class CleanupExample {
    public static void main(String[] args) throws IOException {
        @Cleanup InputStream in = new FileInputStream(args[0]);
        @Cleanup OutputStream out = new FileOutputStream(args[1]);
        byte[] b = new byte[10000];
        while (true) {
            int r = in.read(b);
            if (r == -1) break;
            out.write(b, 0, r);
        }
    }
}
import java.io.*;

public class CleanupExample {
    public static void main(String[] args) throws IOException {
        InputStream in = new FileInputStream(args[0]);
        try {
            OutputStream out = new FileOutputStream(args[1]);
            try {
                byte[] b = new byte[10000];
                while (true) {
                    int r = in.read(b);
                    if (r == -1) break;
                    out.write(b, 0, r);
                }
            } finally {
                if (out != null) {
                    out.close();
                }
            }
        } finally {
            if (in != null) {
                in.close();
            }
        }
    }
}

@Getter and @Setter

我们可以使用@Getter和/@Setter,让 lombok 自动生成默认的 getter/setter方法。

  1. 在属性上添加@Getter和/或@Setter注释。只生成该属性的getter/setter方法。

  2. 在类上添加@Getter和/或@Setter注释。相当对该类中的所有非静态字段进行了注释。

  3. 我们可以使用 AccessLevel.NONE访问级别来排除某些属性,不让他生成getter/setter方法

  4. 生成的 getter/setter方法默认是public的。我们也可以使用AccessLevel.PUBLIC、AccessLevel.PROTECTED、AccessLevel.PACKAGE、AccessLevel.PRIVATE的来指定访问级别

以下两段代码效果等同

import lombok.AccessLevel;
import lombok.Getter;
import lombok.Setter;

public class GetterSetterExample {
    @Getter
    @Setter
    private int age = 10;

    @Setter(AccessLevel.PROTECTED)
    private String name;

    @Override
    public String toString() {
        return String.format("%s (age: %d)", name, age);
    }
}
public class GetterSetterExample {
    private int age = 10;
    private String name;

    @Override
    public String toString() {
        return String.format("%s (age: %d)", name, age);
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    protected void setName(String name) {
        this.name = name;
    }
}

@ToString

任何类定义都可以使用注释@ToString来让 lombok 生成toString()方法的实现。默认情况下,它会按顺序打印您的类名以及每个字段,并以逗号分隔。

下面两段代码 效果等同

import lombok.ToString;

import java.awt.*;

@ToString
public class ToStringExample {
    private static final int STATIC_VAR = 10;
    private String name;
    private Shape shape = new Square(5, 10);
    private String[] tags;
    @ToString.Exclude
    private int id;

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

    @ToString(callSuper = true, includeFieldNames = true)
    public static class Square extends Shape {
        private final int width, height;

        public Square(int width, int height) {
            this.width = width;
            this.height = height;
        }
    }
}
import java.awt.*;
import java.util.Arrays;

public class ToStringExample {
    private static final int STATIC_VAR = 10;
    private String name;
    private Shape shape = new Square(5, 10);
    private String[] tags;
    private int id;

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

    public static class Square extends Shape {
        private final int width, height;

        public Square(int width, int height) {
            this.width = width;
            this.height = height;
        }

        @Override
        public String toString() {
            return "Square(super=" + super.toString() + ", width=" + this.width + ", height=" + this.height + ")";
        }
    }

    @Override
    public String toString() {
        return "ToStringExample(" + this.getName() + ", " + this.shape + ", " + Arrays.deepToString(this.tags) + ")";
    }
}

@EqualsAndHashCode

@NoArgsConstructor

定做构造函数:生成不带参数的构造函数

@AllArgsConstructor

定做构造函数:生成带全部参数的构造函数

@RequiredArgsConstructor (待补充)

@Data(待补充)

现在全部在一起:@ToString, @EqualsAndHashCode, @Getter在所有字段和@Setter所有非最终字段上的快捷方式,以及 @RequiredArgsConstructor!

@Value(待补充)

不可变类变得非常容易。

@Builder(待补充)

…而 Bob 是你的叔叔:用于创建对象的无障碍花哨 API!

@SneakyThrows(待补充)

大胆地抛出之前没有人抛出过的已检查异常!

@Synchronized(待补充)

synchronized 做得对:不要暴露你的锁。

@With(待补充)

不可变的“setter” - 创建一个克隆但具有一个更改字段的方法。

@Getter(lazy=true)(待补充)

懒惰是一种美德!

@Log(待补充)

船长日志,星历 24435.7:“那条线又是什么?”

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值