Lombok注解笔记

简介: Lombok注解笔记

前言

把lombok的注解过了一遍,发现有个@ExtensionMethod和kotlin的拓展函数有点类似

注解

@AllArgsConstructor

作用

生成包含所有字段的构造器

参数
  • staticName : 不为空的话,生成一个静态方法返回实例,并把构造器设置为private
@AllArgsConstructor(staticName = "create")
public class Example {
    private int foo;
    private final String bar;
}复制代码

生成:

public class Example {
    private int foo;
    private final String bar;
    private Example(int foo, String bar) {
        this.foo = foo;
        this.bar = bar;
    }
    public static Example create(int foo, String bar) {
        return new Example(foo, bar);
    }
}复制代码
  • access : 构造器访问权限修饰符,默认public

@Builder

作用

生成构建者(Builder)模式

例子:
@Builder
public class Example {
    private int foo;
    private final String bar;
}复制代码

生成:

public class Example {
    private int foo;
    private final String bar;
    Example(int foo, String bar) {
        this.foo = foo;
        this.bar = bar;
    }
    public static Example.ExampleBuilder builder() {
        return new Example.ExampleBuilder();
    }
    public static class ExampleBuilder {
        private int foo;
        private String bar;
        ExampleBuilder() {
        }
        public Example.ExampleBuilder foo(int foo) {
            this.foo = foo;
            return this;
        }
        public Example.ExampleBuilder bar(String bar) {
            this.bar = bar;
            return this;
        }
        public Example build() {
            return new Example(this.foo, this.bar);
        }
        public String toString() {
            return "Example.ExampleBuilder(foo=" + this.foo + ", bar=" + this.bar + ")";
        }
    }
}复制代码
参数
  • builderMethodName : 创建构建器实例的方法名称
  • buildMethodName:构建器类中创建构造器实例的方法名称
  • builderClassName:构造器类名
  • toBuilder:生成toBuilder方法
例子
public Example.ExampleBuilder toBuilder() {
    return (new Example.ExampleBuilder()).foo(this.foo).bar(this.bar);
}复制代码

@Cleanup

作用

在变量上声明@Cleanup,生成的代码会把变量用try{}包围,并在finallly块中调用close()

例子
public class Example {
    public void copyFile(String in, String out) throws IOException {
        @Cleanup FileInputStream inStream = new FileInputStream(in);
        @Cleanup FileOutputStream outStream = new FileOutputStream(out);
        byte[] b = new byte[65536];
        while (true) {
            int r = inStream.read(b);
            if (r == -1) break;
            outStream.write(b, 0, r);
        }
    }
}复制代码

生成后:

public class Example {
    public Example() {
    }
    public void copyFile(String in, String out) throws IOException {
        FileInputStream inStream = new FileInputStream(in);
        try {
            FileOutputStream outStream = new FileOutputStream(out);
            try {
                byte[] b = new byte[65536];
                while(true) {
                    int r = inStream.read(b);
                    if (r == -1) {
                        return;
                    }
                    outStream.write(b, 0, r);
                }
            } finally {
                if (Collections.singletonList(outStream).get(0) != null) {
                    outStream.close();
                }
            }
        } finally {
            if (Collections.singletonList(inStream).get(0) != null) {
                inStream.close();
            }
        }
    }
}复制代码
参数
  • value:被在finally块中调用的方法名,方法体不能带有参数,默认为close

@Data

作用

生成所有字段的getter、toString()、hashCode()、equals()、所有非final字段的setter、构造器,相当于设置了 @Getter @Setter @RequiredArgsConstructor @ToString @EqualsAndHashCode

例子
@Data
public class Example {
    private int foo;
    private final String bar;
}复制代码

生成:

public class Example {
    private int foo;
    private final String bar;
    public Example(String bar) {
        this.bar = bar;
    }
    public int getFoo() {
        return this.foo;
    }
    public String getBar() {
        return this.bar;
    }
    public void setFoo(int foo) {
        this.foo = foo;
    }
    public boolean equals(Object o) {
        if (o == this) {
            return true;
        } else if (!(o instanceof Example)) {
            return false;
        } else {
            Example other = (Example)o;
            if (!other.canEqual(this)) {
                return false;
            } else if (this.getFoo() != other.getFoo()) {
                return false;
            } else {
                Object this$bar = this.getBar();
                Object other$bar = other.getBar();
                if (this$bar == null) {
                    if (other$bar != null) {
                        return false;
                    }
                } else if (!this$bar.equals(other$bar)) {
                    return false;
                }
                return true;
            }
        }
    }
    protected boolean canEqual(Object other) {
        return other instanceof Example;
    }
    public int hashCode() {
        int PRIME = true;
        int result = 1;
        int result = result * 59 + this.getFoo();
        Object $bar = this.getBar();
        result = result * 59 + ($bar == null ? 43 : $bar.hashCode());
        return result;
    }
    public String toString() {
        return "Example(foo=" + this.getFoo() + ", bar=" + this.getBar() + ")";
    }
}复制代码

@Delegate

@EqualsAndHashCode

作用

生成hashCode()、equals(),效果见@Data

参数
  • callSuper:是否调用父类的hashCode(),默认:false
  • doNotUseGetters:是否不调用字段的getter,默认如果有getter会调用。设置为true,直接访问字段,不调用getter
  • exclude:此处列出的任何字段都不会在生成的equals和hashCode中使用。
  • of:与exclude相反,设置of,exclude失效
  • onParam:添加注解,参考@Getter#onMethod

@Generated

作用

这个注解似乎没有实在的作用,就是标记这个类、字段、方法是自动生成的

@Getter

作用

生成getter、写在类上会生成该类下所有字段的getter。写在某个字段上就作用与该字段

参数
  • onMethod:把需要添加的注解写在这
例子
public class Example {
    @Getter(onMethod_={@Deprecated}) // JDK7写法 @Getter(onMethod=@__({@Deprecated}))
    private int foo;
    private final String bar  = "";
}复制代码

生成:

public class Example {
    private int foo;
    private final String bar = "";
    public Example() {
    }
    /** @deprecated */
    @Deprecated
    public int getFoo() {
        return this.foo;
    }
}复制代码
  • value:访问权限修饰符

@NoArgsConstructor

作用

生成无参数构造器

参数
  • access:访问权限修饰符
  • force:为true时,强制生成构造器,final字段初始化为null
  • onConstructor:添加注解,参考@Getter#onMethod

@NonNull

作用

空检查

例子
public class Example {
    @NonNull
    @Getter
    @Setter
    private Integer foo;
}复制代码

生成后:

public class Example {
    @NonNull
    private Integer foo;
    public Example() {
    }
    @NonNull
    public Integer getFoo() {
        return this.foo;
    }
    public void setFoo(@NonNull Integer foo) {
        if (foo == null) {
            throw new NullPointerException("foo is marked @NonNull but is null");
        } else {
            this.foo = foo;
        }
    }
}复制代码

@RequiredArgsConstructor

作用

生成必须初始化字段的构造器,比如带final、@NonNull

例子
@RequiredArgsConstructor
public class Example {
    @NonNull
    private Integer foo;
    private final String bar;
}复制代码

生成后:

public class Example {
    @NonNull
    private Integer foo;
    private final String bar;
    public Example(@NonNull Integer foo, String bar) {
        if (foo == null) {
            throw new NullPointerException("foo is marked @NonNull but is null");
        } else {
            this.foo = foo;
            this.bar = bar;
        }
    }
}复制代码

@Setter

作用

生成Setter

参数
  • onMethod:在方法上添加中注解,见@Getter#onMethod
  • onParam:在方法的参数上添加注解,见@Getter#onMethod
  • value:访问权限修饰符

@Singular

作用

这个注解和@Builder一起使用,为Builder生成字段是集合类型的add方法,字段名不能是单数形式,否则需要指定value值

例子
@Builder
public class Example {
    @Singular
    @Setter
    private List<Integer> foos;
}复制代码

生成:

public class Example {
    private List<Integer> foos;
    Example(List<Integer> foos) {
        this.foos = foos;
    }
    public static Example.ExampleBuilder builder() {
        return new Example.ExampleBuilder();
    }
    public void setFoos(List<Integer> foos) {
        this.foos = foos;
    }
    public static class ExampleBuilder {
        private ArrayList<Integer> foos;
        ExampleBuilder() {
        }
        // 这方法是@Singular作用生成的
        public Example.ExampleBuilder foo(Integer foo) {
            if (this.foos == null) {
                this.foos = new ArrayList();
            }
            this.foos.add(foo);
            return this;
        }
        public Example.ExampleBuilder foos(Collection<? extends Integer> foos) {
            if (this.foos == null) {
                this.foos = new ArrayList();
            }
            this.foos.addAll(foos);
            return this;
        }
        public Example.ExampleBuilder clearFoos() {
            if (this.foos != null) {
                this.foos.clear();
            }
            return this;
        }
        public Example build() {
            List foos;
            switch(this.foos == null ? 0 : this.foos.size()) {
            case 0:
                foos = Collections.emptyList();
                break;
            case 1:
                foos = Collections.singletonList(this.foos.get(0));
                break;
            default:
                foos = Collections.unmodifiableList(new ArrayList(this.foos));
            }
            return new Example(foos);
        }
        public String toString() {
            return "Example.ExampleBuilder(foos=" + this.foos + ")";
        }
    }
}复制代码

@SneakyThrows

作用

用try{}catch{}捕捉异常

例子
public class Example {
    @SneakyThrows(UnsupportedEncodingException.class)
    public String utf8ToString(byte[] bytes) {
        return new String(bytes, "UTF-8");
    }
}复制代码

生成后:

public class Example {
    public Example() {
    }
    public String utf8ToString(byte[] bytes) {
        try {
            return new String(bytes, "UTF-8");
        } catch (UnsupportedEncodingException var3) {
            throw var3;
        }
    }
}复制代码

@Synchronized

作用

生成Synchronized(){}包围代码

例子
public class Example {
    @Synchronized
    public String utf8ToString(byte[] bytes) {
        return new String(bytes, Charset.defaultCharset());
    }
}复制代码

生成后:

public class Example {
    private final Object $lock = new Object[0];
    public Example() {
    }
    public String utf8ToString(byte[] bytes) {
        Object var2 = this.$lock;
        synchronized(this.$lock) {
            return new String(bytes, Charset.defaultCharset());
        }
    }
}复制代码

@ToString

作用

生成toString()方法

@val

作用

变量声明类型推断

例子
public class ValExample {
    public String example() {
        val example = new ArrayList<String>();
        example.add("Hello, World!");
        val foo = example.get(0);
        return foo.toLowerCase();
    }
    public void example2() {
        val map = new HashMap<Integer, String>();
        map.put(0, "zero");
        map.put(5, "five");
        for (val entry : map.entrySet()) {
            System.out.printf("%d: %s\n", entry.getKey(), entry.getValue());
        }
    }
}复制代码

生成后:

public class ValExample {
    public ValExample() {
    }
    public String example() {
        ArrayList<String> example = new ArrayList();
        example.add("Hello, World!");
        String foo = (String)example.get(0);
        return foo.toLowerCase();
    }
    public void example2() {
        HashMap<Integer, String> map = new HashMap();
        map.put(0, "zero");
        map.put(5, "five");
        Iterator var2 = map.entrySet().iterator();
        while(var2.hasNext()) {
            Entry<Integer, String> entry = (Entry)var2.next();
            System.out.printf("%d: %s\n", entry.getKey(), entry.getValue());
        }
    }
}复制代码

@Value

作用

把类声明为final,并添加toString()、hashCode()等方法,相当于 @Getter @FieldDefaults(makeFinal=true, level=AccessLevel.PRIVATE) @AllArgsConstructor @ToString @EqualsAndHashCode.

例子
@Value
public class Example {
    private Integer foo;
}复制代码

生成后:

public final class Example {
    private final Integer foo;
    public Example(Integer foo) {
        this.foo = foo;
    }
    public Integer getFoo() {
        return this.foo;
    }
    public boolean equals(Object o) {
        if (o == this) {
            return true;
        } else if (!(o instanceof Example)) {
            return false;
        } else {
            Example other = (Example)o;
            Object this$foo = this.getFoo();
            Object other$foo = other.getFoo();
            if (this$foo == null) {
                if (other$foo != null) {
                    return false;
                }
            } else if (!this$foo.equals(other$foo)) {
                return false;
            }
            return true;
        }
    }
    public int hashCode() {
        int PRIME = true;
        int result = 1;
        Object $foo = this.getFoo();
        int result = result * 59 + ($foo == null ? 43 : $foo.hashCode());
        return result;
    }
    public String toString() {
        return "Example(foo=" + this.getFoo() + ")";
    }
}复制代码

@var

作用

和val一样,官方文档中说区别就是var不加final修饰,但测试的效果是一样的

Experimental注解

在lombok.experimental包下

@Accessors

作用

默认情况下,没什么作用,需要设置参数

参数
  • chain:为true时,setter链式返回,即setter的返回值为this
  • fluent:为true时,默认设置chain为true,setter的方法名修改为字段名

@Delegate

作用

代理模式,把字段的方法代理给类,默认代理所有方法

参数
  • types:指定代理的方法
  • excludes:和types相反
例子
public class Example {
    private interface Add {
        boolean add(String x);
        boolean addAll(Collection<? extends String> x);
    }
    private @Delegate(types = Add.class) List<String> strings;
}复制代码

生成后:

public class Example {
    private List<String> strings;
    public Example() {
    }
    public boolean add(String x) {
        return this.strings.add(x);
    }
    public boolean addAll(Collection<? extends String> x) {
        return this.strings.addAll(x);
    }
    private interface Add {
        boolean add(String var1);
        boolean addAll(Collection<? extends String> var1);
    }
}复制代码

@ExtensionMethod

作用

拓展方法,向现有类型“添加”方法,而无需创建新的派生类型。有点像kotlin的扩展函数。

例子
@ExtensionMethod({Arrays.class, Extensions.class})
public class Example {
    public static void main(String[] args) {
        int[] intArray = {5, 3, 8, 2};
        intArray.sort();
        int num = 1;
        num = num.increase();
        Arrays.stream(intArray).forEach(System.out::println);
        System.out.println("num = " + num);
    }
}
class Extensions {
    public static int increase(int num) {
        return ++num;
    }
}复制代码

生成后:

public class Example {
    public Example() {
    }
    public static void main(String[] args) {
        int[] intArray = new int[]{5, 3, 8, 2};
        Arrays.sort(intArray);
        int num = 1;
        int num = Extensions.increase(num);
        IntStream var10000 = Arrays.stream(intArray);
        PrintStream var10001 = System.out;
        System.out.getClass();
        var10000.forEach(var10001::println);
        System.out.println("num = " + num);
    }
}复制代码

输出:

2
3
5
8
num = 2复制代码

@FieldDefaults

作用

定义类、字段的修饰符

参数
  • AccessLevel:访问权限修饰符
  • makeFinal:是否加final

@FieldNameConstants

作用

默认生成一个常量,名称为大写字段名,值为字段名

参数
  • prefix:前缀
  • suffix:后缀
例子
public class Example {
    @FieldNameConstants(prefix = "PREFIX_", suffix = "_SUFFIX")
    private String foo;
}复制代码

生成后:

public class Example {
    public static final String PREFIX_FOO_SUFFIX = "foo";
    private String foo;
    public Example() {
    }
}复制代码

@Helper

作用

方法内部的类方法暴露给方法使用

测试时,maven编译不通过。

@NonFinal

作用

设置不为Final,@FieldDefaults和@Value也有这功能

@PackagePrivate

作用

设置为private,@FieldDefaults和@Value也有这功能

@SuperBuilder

@Tolerate

@UtilityClass

@Wither

作用

生成withXXX方法,返回类实例

例子
@RequiredArgsConstructor
public class Example {
    private @Wither final int foo;
}复制代码

生成后:

public class Example {
    private final int foo;
    public Example(int foo) {
        this.foo = foo;
    }
    public Example withFoo(int foo) {
        return this.foo == foo ? this : new Example(foo);
    }
}



相关文章
|
28天前
|
Java 开发工具 Android开发
Kotlin语法笔记(26) -Kotlin 与 Java 共存(1)
本系列教程笔记详细讲解了Kotlin语法,适合需要深入了解Kotlin的开发者。若需快速学习Kotlin,建议查看“简洁”系列教程。本期重点介绍了Kotlin与Java的共存方式,包括属性、单例对象、默认参数方法、包方法、扩展方法以及内部类和成员的互操作性。通过这些内容,帮助你在项目中更好地结合使用这两种语言。
42 1
|
29天前
|
Java 开发工具 Android开发
Kotlin语法笔记(26) -Kotlin 与 Java 共存(1)
Kotlin语法笔记(26) -Kotlin 与 Java 共存(1)
32 2
|
30天前
|
XML Java 编译器
Java学习十六—掌握注解:让编程更简单
Java 注解(Annotation)是一种特殊的语法结构,可以在代码中嵌入元数据。它们不直接影响代码的运行,但可以通过工具和框架提供额外的信息,帮助在编译、部署或运行时进行处理。
87 43
Java学习十六—掌握注解:让编程更简单
|
25天前
|
Java 开发者 Spring
[Java]自定义注解
本文介绍了Java中的四个元注解(@Target、@Retention、@Documented、@Inherited)及其使用方法,并详细讲解了自定义注解的定义和使用细节。文章还提到了Spring框架中的@AliasFor注解,通过示例帮助读者更好地理解和应用这些注解。文中强调了注解的生命周期、继承性和文档化特性,适合初学者和进阶开发者参考。
46 14
|
25天前
|
前端开发 Java
[Java]讲解@CallerSensitive注解
本文介绍了 `@CallerSensitive` 注解及其作用,通过 `Reflection.getCallerClass()` 方法返回调用方的 Class 对象。文章还详细解释了如何通过配置 VM Options 使自定义类被启动类加载器加载,以识别该注解。涉及的 VM Options 包括 `-Xbootclasspath`、`-Xbootclasspath/a` 和 `-Xbootclasspath/p`。最后,推荐了几篇关于 ClassLoader 的详细文章,供读者进一步学习。
31 12
|
19天前
|
安全 Java 编译器
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
|
19天前
|
Java 开发工具 Android开发
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
|
19天前
|
Java 编译器 Android开发
Kotlin教程笔记(28) -Kotlin 与 Java 混编
Kotlin教程笔记(28) -Kotlin 与 Java 混编
|
5天前
|
Java 编译器 Android开发
Kotlin教程笔记(28) -Kotlin 与 Java 混编
Kotlin教程笔记(28) -Kotlin 与 Java 混编
9 0
|
28天前
|
Java 编译器 Android开发
Kotlin语法笔记(28) -Kotlin 与 Java 混编
本系列教程详细讲解了Kotlin语法,适合需要深入了解Kotlin的开发者。对于希望快速学习Kotlin的用户,推荐查看“简洁”系列教程。本文档重点介绍了Kotlin与Java混编的技巧,包括代码转换、类调用、ProGuard问题、Android library开发建议以及在Kotlin和Java之间互相调用的方法。
20 1
下一篇
无影云桌面