lombok有参构造注解_Java高效开发工具: Lombok

2023-05-16

Lombok, 一个Java开发必备效率工具,可以大大避免编写一些常用方法(get/set, hashcode等),简化开发。虽然现在IDE很多都可以通过快捷键生成POJO的一些方法了,但是如果该POJO字段发生变动后,还是需要程序员再次手动重新生成相关方法。而Lombok只需要使用注解即可,且是在代码编译期间将注解替换为相应的代码,而非通过反射。同时会使得源码文件更简洁

配置

IDEA环境下的的Lombok的配置:

1. 首先在Maven中添加Lombok包

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

2. 在IDEA的Plugins Marketplace 中搜索安装 IntelliJ Lombok plugin 插件

POJO 方法

POJO类的很多方法get、setequals、canEquals、hashCode、toStringConstructor 都可以通过Lombok的相关注解实现

@Data 注解

放置在类上,为该类的所有属性添加get、set方法,为该类添加equals、canEquals、hashCode、toString方法。非常适用于POJO类。

示例源码如下:

@Data
class Pc1 implements Serializable
{
    private static final long serialVersionUID = 1;
    private int id;
    private double prcie;
    private String pcname;
}

编译后class文件如下,可以看到提供了上述提到的所有方法,并且源码依然很简洁

Note:

如果无构造器方法,Java会提供一个默认的无参构造器。所以class文件中的那个无参构造器可不是Lombok的功劳哦~

@Getter, @Setter 注解

  • 放置在属性上,为该属性添加Get/Set方法

示例源码如下:

class Pc2 implements Serializable
{
    private static final long serialVersionUID = 1;
    private int id;
    @Setter
    private double prcie;
    @Getter
    private String pcname;
}

编译后class文件如下,可以看到字段上添加了相应的方法

  • 放置在类上,则为该类的所有属性添加Get/Set方法

@EqualsAndHashCode 注解

放置在类上,为该类添加equals、canEqual、hashCode方法

示例源码如下:

@EqualsAndHashCode
class Pc5 implements Serializable
{
    private static final long serialVersionUID = 1;
    private int id;
    private double prcie;
    private String pcname;
}

编译后class文件如下,该类添加了equals、canEqual、hashCode方法

@ToString 注解

放置在类上,为该类添加toString方法

示例源码如下:

@ToString
class Pc6
{
    private int id;
    private double price;
    private String pcname;
}

编译后class文件如下,该类添加了toString方法

构造器: @AllArgsConstructor 注解

放置在类上,为该类添加一个全参构造器。需要注意的是:由于此时已经有构造器了,Java不再提供无参构造器

示例源码如下:

@AllArgsConstructor
class Pc3 implements Serializable
{
    private static final long serialVersionUID = 1;
    private int id;
    private double prcie;
    private String pcname;
}

编译后class文件如下,该类添加了一个全参构造器

构造器: @NoArgsConstructor 注解

放置在类上,为该类添加一个无参构造器

示例源码如下:

@NoArgsConstructor
class Pc4 implements Serializable
{
    private static final long serialVersionUID = 1;
    private int id;
    private double prcie;
    private String pcname;
}

编译后class文件如下,该类添加了一个无参构造器

@NonNull

放置在属性上,将对该属性进行非空检查,如果为空(null),将会抛出NullPointerException;同时为该类添加一个由所有@NonNull属性组成的有参构造器。需要注意的是:由于此时已经有构造器了,Java不再提供无参构造器

示例代码如下:

@Data
class Pc7
{
    @NonNull
    private Integer id;
    private double price;
    private String pcname;
}

编译后class文件如下,该类中对id属性的操作均进行了非空检查,添加了一个所有@NonNull属性组成(id属性)的有参构造器

@RequiredArgsConstructor 注解 简化依赖注入

通常我们在实现Spring依赖注入,常常是在需要注入的属性添加@Autowired注解实现(如下所示)。但如果一个类下有很多属性需要注入时,@Autowired就要写一堆了……

...
    @Controller
    public class Controller1{
        @Autowired
        private Service1 service1;
        @Autowired
        private Service2 service2;
        ...
    }

这里可以使用这里@RequiredArgsConstructor注解来简化依赖注入操作:首先需要将该注解放在类上,然后在 需要注入的属性前添加final(用法1) 或 在需要注入的属性上添加注解@NonNull(用法2)

对上述示例的改进写法如下:

...
    @RequiredArgsConstructor(onConstructor = @__(@Autowired))
    @Controller
    public class Controller1{
        // 用法 1
        private final Service1 service1;
        // 用法 2
        @NonNull
        private Service2 service2;
        ...
    }

用法1 和 用法2 虽然效果一样,但是很明显用法1更常用……

log对象

@Log4j

放置在类上,为该类添加一个属性名为log的Log4J日志对象

示例源码如下:

@Log4j
    public class Student {        
        private int id;
        private String username;
        private String sex;
        private String address;
        ...
    }

编译后的class文件如下,该类添加了一个属性名为log的Log4J日志对象

@Slf4j

放置在类上,为该类添加一个属性名为log的SLF4J日志对象

示例源码如下:

import lombok.extern.slf4j.Slf4j;
    @Slf4j
    public class User {
        private int id;
        private String name;
        private int age;

        public int getAge() {
            log.error("SLF4J getAge: " + age );
            log.debug("SLF4J getAge: " + age );
            return age;
        }
        ...
    }

编译后的class文件如下,该类添加了一个属性名为log的SLF4J日志对象

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

lombok有参构造注解_Java高效开发工具: Lombok 的相关文章

  • JDT - 尝试更改类型的超类。我不知道超级类的限定名称

    我有一个程序 除其他任务外 还必须使用 JDT 更改某些类的超类 我有两个字符串 其中包含要交换的超类的限定名称 例如 org example John 和 org example Smith 并且我正在解析整个 AST 搜索扩展这些类的类
  • 从字符串中删除多个子字符串 - Java

    我需要从给定字符串中删除多个子字符串 例子 String exclude one two three String input if we add one and two we get three 我希望我的程序从输入字符串中删除所有出现的
  • 如何修复安装 maven jar 插件依赖项时出现的错误?

    我正在将应用程序制作成 maven 中的 jar 文件 但是 当我从 Maven 中提取 jar 插件存储库并在终端中运行这三个命令时 mvn clean mvn compile mvn package 在 mvn package 中 我收
  • 将倒计时器从 10 秒改为 1 秒

    我有一个倒计时器 它以 1 秒的增量从 10000 毫秒倒计时到 0 毫秒 以使按钮在 10 秒后可单击 尽管计时器是准确的并且按照代码的说明执行操作 但我想更改秒的表示方式 但我不知道如何更改 java void startTimer c
  • Guice:当 FactoryBuilder 中提供合适的构造函数时,“找不到合适的构造函数”

    我使用 Guice 进行依赖注入 但收到此错误 1 Could not find a suitable constructor in java lang Void Classes must have either one and only
  • 克隆 dom.Document 对象

    我的目的是将xml文件读入Dom对象 编辑dom对象 其中涉及删除一些节点 完成此操作后 我希望将 Dom 恢复到其原始状态 而不实际解析 XML 文件 无论如何 我可以克隆第一次解析 xml 文件后获得的 dom 对象吗 这个想法是避免一
  • 打印数组时出错

    我得到这个代码 import java util import java io public class Oblig3A public static void main String args OrdAnalyse O new OrdAna
  • docker 中带有参数的 jar 文件

    Helo 我有一个 java jar 文件 当我从终端运行它时 它会接受一堆参数作为输入 我想制作一个 docker 映像并运行它 其中包含 jar 文件 我仍然可以在其中传递 jar 文件的参数 将 jar 文件设置为您的入口点 http
  • 使用嵌入式 Jetty 7 发布 JAX-WS 端点

    有人可以帮忙吗 我想使用嵌入式 Jetty 7 作为端点 这是我尝试过的 public class MiniTestJetty WebService targetNamespace http public static class Calc
  • 在仔细锁定但不受信任的代码上使用 Thread.stop()

    我知道Thread stop 已被弃用 并且有充分的理由 它通常不安全 但这并不意味着它是never安全 据我所知 在我想要使用它的上下文中它是安全的 而且 据我所知 我别无选择 上下文是一个两人策略游戏的第三方插件 以国际象棋为例 第三方
  • 当对话框打开时如何处理屏幕方向变化?

    我有一个 Android 应用程序 它已经在处理方向的更改 即有一个android configChanges orientation 在清单和onConfigurationChange 活动中的处理程序切换到适当的布局并准备它 我有一个横
  • Spring Boot - 如何在开发过程中禁用@Cacheable?

    我正在寻找两件事 如何在开发过程中使用 Spring boot dev 配置文件禁用所有缓存 application properties 中似乎没有通用设置可以将其全部关闭 最简单的方法是什么 如何禁用特定方法的缓存 我尝试像这样使用 S
  • oracle.jdbc.driver.OracleDriver ClassNotFoundException

    这是我收到错误的代码 我的classes12 jar已作为外部 jar 导入 import java io IOException import java io PrintWriter import java sql Connection
  • 为什么这段代码可以在 Java 7 中运行,而不能在 Java 8 中运行?

    我目前使用 IDE Eclipse 版本 Neon 2 Release 4 6 2 和版本 java Version 8 Update 131 在此代码中 IDE 给出错误 类型不匹配 无法从字节转换为整数 Integer i byte 1
  • 使用mapstruct映射不同类型列表的元素

    我们正在映射一个对象 该对象具有一个对象列表 这些对象都实现了父接口 但可能具有不同的实现 但当我们映射列表时 似乎只有来自 ParentClass 的值被映射 而不是来自子类的值 但直接映射子进程就可以了 public class Par
  • 如何管理一个 JInternalFrame 调用另一个 JInternalFrame?

    我有一个带有此代码的 JDesktopPane public class Menu extends JFrame implements ActionListener Creates new form Portada public stati
  • 如何强制 Spark 执行代码?

    我如何强制 Spark 执行对 map 的调用 即使它认为由于其惰性求值而不需要执行它 我试过把cache 与地图调用 但这仍然没有解决问题 我的地图方法实际上将结果上传到 HDFS 所以 它并非无用 但 Spark 认为它是无用的 简短回
  • 我的代码线程不安全吗?

    我编写了代码来理解 CyclicBarrier 我的应用程序模拟选举 每轮选出得票少的候选人 该候选人从竞争中淘汰以获得胜利 source class ElectoralCommission public volatile boolean
  • 如何为用户的活动设置计时器?

    如果用户在 5 小时内停止工作 我需要执行特定的方法 假设用户已登录 但他在 5 小时内没有向数据库的特定表添加任何记录 任何时候用户将记录添加到指定的表中 该特定用户的计时器都应该重置 否则它将继续运行 如果达到 5 小时 应用程序应显示
  • 如何在java中进行多处理,以及预期的速度提升是多少?

    我是一个新手 使用 Java 对 csv 文件进行一些数据处理 为此 我使用 Java 的多线程功能 线程池 将 csv 文件批量导入到 Java 中 并对每一行执行一些操作 在我的四核处理器上 多线程大大加快了处理速度 我很想知道多处理如

随机推荐