lombok 构造函数_Java开发神器:Lombok 学习指南

点击上方“Java知音”,选择“置顶公众号”

技术文章第一时间送达!

作者:semlinker

www.segmentfault.com/a/1190000020864572

一、Lombok 简介

Lombok 是一款 Java 开发插件,使得 Java 开发者可以通过其定义的一些注解来消除业务工程中冗长和繁琐的代码,尤其对于简单的 Java 模型对象(POJO)。

在开发环境中使用 Lombok 插件后,Java 开发人员可以节省出重复构建,诸如 hashCode 和 equals 这样的方法以及各种业务对象模型的 accessor 和 toString 等方法的大量时间。

对于这些方法,Lombok 能够在编译源代码期间自动帮我们生成这些方法,但并不会像反射那样降低程序的性能。

二、Lombok 安装

2.1 构建工具

Gradle

在 build.gradle 文件中添加 lombok 依赖:

dependencies {
    
    compileOnly 'org.projectlombok:lombok:1.18.10'
    annotationProcessor 'org.projectlombok:lombok:1.18.10'
}

Maven

在 Maven 项目的 pom.xml 文件中添加 lombok 依赖:

<dependency>
        <groupId>org.projectlombokgroupId>
        <artifactId>lombokartifactId>
        <version>1.18.10version>
        <scope>providedscope>
dependency>

Ant

假设在 lib 目录中已经存在 lombok.jar,然后设置 javac 任务:

<javac srcdir="src" destdir="build" source="1.8">
    <classpath location="lib/lombok.jar" />
javac>

2.2 IDE

由于 Lombok 仅在编译阶段生成代码,所以使用 Lombok 注解的源代码,在 IDE 中会被高亮显示错误,针对这个问题可以通过安装 IDE 对应的插件来解决。

这里不详细展开,具体的安装方式可以参考:

https://www.baeldung.com/lombok-ide

三、Lombok 详解

注意:以下示例所使用的 Lombok 版本是 1.18.10

3.1 @Getter and @Setter 注解

你可以使用 @Getter 或 @Setter 注释任何类或字段,Lombok 会自动生成默认的 getter/setter 方法。

@Getter 注解

@Target({ElementType.FIELD, ElementType.TYPE})
@Retention(RetentionPolicy.SOURCE)
public @interface Getter {
  // 若getter方法非public的话,可以设置可访问级别
    lombok.AccessLevel value() default lombok.AccessLevel.PUBLIC;
    AnyAnnotation[] onMethod() default {};
  // 是否启用延迟初始化
    boolean lazy() default false;
}

@Setter 注解

@Target({ElementType.FIELD, ElementType.TYPE})
@Retention(RetentionPolicy.SOURCE)
public @interface Setter {
  // 若setter方法非public的话,可以设置可访问级别
    lombok.AccessLevel value() default lombok.AccessLevel.PUBLIC;
    AnyAnnotation[] onMethod() default {};
    AnyAnnotation[] onParam() default {};
}

使用示例

package com.semlinker.lombok;

@Getter
@Setter
public class GetterAndSetterDemo {
    String firstName;
    String lastName;
    LocalDate dateOfBirth;
}

以上代码经过 Lombok 编译后,会生成如下代码:

package com.semlinker.lombok;

public class GetterAndSetterDemo {
    String firstName;
    String lastName;
    LocalDate dateOfBirth;

    public GetterAndSetterDemo() {
    }

    // 省略其它setter和getter方法
    public String getFirstName() {
        return this.firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
}

Lazy Getter

@Getter 注解支持一个 lazy 属性,该属性默认为 false。当设置为 true 时,会启用延迟初始化,即当首次调用 getter 方法时才进行初始化。

示例

package com.semlinker.lombok;

public class LazyGetterDemo {
    public static void main(String[] args) {
        LazyGetterDemo m = new LazyGetterDemo();
        System.out.println("Main instance is created");
        m.getLazy();
    }

    @Getter
    private final String notLazy = createValue("not lazy");

    @Getter(lazy = true)
    private final String lazy = createValue("lazy");

    private String createValue(String name) {
        System.out.println("createValue(" + name + ")");
        return null;
    }
}

以上代码经过 Lombok 编译后,会生成如下代码:

package com.semlinker.lombok;

public class LazyGetterDemo {
    private final String notLazy = this.createValue("not lazy");
    private final AtomicReference lazy = new AtomicReference();// 已省略部分代码public String getNotLazy() { return this.notLazy;
    }public String getLazy() {
        Object value = this.lazy.get();if (value == null) {
            synchronized(this.lazy) {
                value = this.lazy.get();if (value == null) {
                    String actualValue = this.createValue("lazy");
                    value = actualValue == null ? this.lazy : actualValue;this.lazy.set(value);
                }
            }
        }return (String)((String)(value == this.lazy ? null : value));
    }
}

通过以上代码可知,调用 getLazy 方法时,若发现 value 为 null,则会在同步代码块中执行初始化操作。

3.2 Constructor Annotations

@NoArgsConstructor 注解

使用 @NoArgsConstructor 注解可以为指定类,生成默认的构造函数,@NoArgsConstructor 注解的定义如下:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.SOURCE)
public @interface NoArgsConstructor {
  // 若设置该属性,将会生成一个私有的构造函数且生成一个staticName指定的静态方法
    String staticName() default "";    
    AnyAnnotation[] onConstructor() default {};
  // 设置生成构造函数的访问级别,默认是public
    AccessLevel access() default lombok.AccessLevel.PUBLIC;
  // 若设置为true,则初始化所有final的字段为0/null/false
    boolean force() default false;
}

示例

package com.semlinker.lombok;

@NoArgsConstructor(staticName = "getInstance")<
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Lombok是一个用于简化Java代码的开源库。在Lombok中,可以使用@NoArgsConstructor注解来生成无参构造函数。这个注解会自动在类中添加一个无参构造函数,使得对象可以通过无参构造函数进行实例化。需要注意的是,在使用@NoArgsConstructor注解时,还会额外生成一个无参构造函数。 下面是一个使用@NoArgsConstructor注解的示例代码: ``` import lombok.NoArgsConstructor; @NoArgsConstructor public class Example { // fields and methods } ``` 在上述示例中,使用了@NoArgsConstructor注解后,Example类就会自动添加一个无参构造函数。 另外,如果你想要在生成的无参构造函数中添加一些额外的逻辑,你可以使用@AllArgsConstructor注解来生成一个带有参数的构造函数,并在其中加入你想要的逻辑。这样,在使用@NoArgsConstructor注解时,就会同时生成无参构造函数和有参构造函数。 引用的第三条内容是关于Lombok在项目中的使用方式的示例代码,它展示了如何在项目的依赖配置中引入Lombok,并配置编译和测试使用Lombok的插件。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Lombok--使用](https://blog.csdn.net/feiying0canglang/article/details/106725810)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值