Lombok高效实践

简介: Lombok 是一种Java 实用工具,可以帮助开发人员消除冗长的重复代码,尤其是对于简单的 Java 对象。它在代码编译阶段就会自动生成相应的代码,所以对性能没有任何影响。


一、概述



Lombok 是一种Java 实用工具,可以帮助开发人员消除冗长的重复代码,尤其是对于简单的 Java 对象。它在代码编译阶段就会自动生成相应的代码,所以对性能没有任何影响。

Maven 项目中引入 Lombok:

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

然后在 IDE(IDEA、Eclipse 等)中安装 Lombok 插件。


二、特性



类型 作用 备注
val 定义 final 本地局部变量 必须要初始化
var 定义本地局部变量 必须要初始化
@NonNull 定义非空检查
@Cleanup 自动关闭资源
@Getter/@Setter 定义 Getter/Setter 方法
@ToString 定义 toString 方法
@EqualsAndHashCode 定义 hashCodeequals 方法
@NoArgsConstructor 定义无参构造方法
@RequiredArgsConstructor 定义非空参数构造方法
@AllArgsConstructor 定义全参构造方法
@Data 包含 @ToString@Getter@Setter 等常用注解
@Builder 定义构造器
@SneakyThrows 定义异常捕获,省略 throws 操作
@Synchronized 定义同步锁
@Log 定义日志变量,支持 @Log4jSlf4j


三、实践



val

使用 val 可以定义一个本地局部变量,而不用指定该变量的类型,默认会使用 final 修饰,所以必须初始化。

public class Example {
    // Lombok
    public void lombok() {
        val str = "CodeArtist";
        val year = 2021;
        System.out.println(str);
        System.out.println(year);
    }
    // 原生Java
    public void example() {
        final String str = "CodeArtist";
        final int year = 2021;
        System.out.println(str);
        System.out.println(year);
    }
}

var

varval 功能一样,定义一个本地局部变量,只不过没有用 final 修饰,可以二次赋值,在使用的时候也需要初始化。

public class Example {
    // Lombok
    public void lombok() {
        var str = "CodeArtist";
        var year = 2021;
        System.out.println(str);
        System.out.println(year);
    }
    // 原生Java
    public void example() {
        String str = "CodeArtist";
        int year = 2021;
        System.out.println(str);
        System.out.println(year);
    }
}

@NonNull

@NonNull 可以作用在构造方法或其他方法的参数上,会在方法开头对参数添加一个非空检验,为空时抛出空指针异常。

public class Example {
    // Lombok
    public void lombok(@NonNull String name) {
        System.out.println(name);
    }
    // 原生Java
    public void example(String name) {
        if (name == null) {
            throw new NullPointerException("name is marked non-null but is null");
        } else {
            System.out.println(name);
        }
    }
}

@Cleanup

在定义一个资源前面添加 @Cleanup,可以使用完后自动调用 close() 方法来关闭资源。

public class Example {
    // Lombok
    public void lombok() throws Exception {
        @Cleanup InputStream in = new FileInputStream("path");
        byte[] b = new byte[10000];
        while (true) {
            int r = in.read(b);
            if (r == -1) break;
        }
    }
    // 原生Java
    public void example() throws Exception {
        InputStream in = new FileInputStream("path");
        try {
            byte[] b = new byte[10000];
            while (true) {
                int r = in.read(b);
                if (r == -1) break;
            }
        } finally {
            if (in != null) {
                in.close();
            }
        }
    }
}

@Getter/@Setter

使用 @Getter/@Setter 注解来生成类字段的 Getter 和 Setter 方法,它们也可以单独作用在字段上,来对生成某个字段 Getter 和 Setter 方法。

// Lombok
@Getter
@Setter
public class Example {
    private int age;
    private String name;
}
// 原生Java
public class Example {
    private int age;
    private String name;
    public int getAge() {
        return this.age;
    }
    public String getName() {
        return this.name;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public void setName(String name) {
        this.name = name;
    }
}

@ToString

使用 @ToString 可以对字段生成 toString 方法,在打印日志的时候可以输出对象的字段值,也可以使用 @ToString.Exclude 注解来指定哪个字段不打印。

// Lombok
@ToString
public class Example {
    private int age;
    private String name;
}
// 原生Java
public class Example {
    private int age;
    private String name;
    public String toString() {
        return "Example(age=" + this.age + ", name=" + this.name + ")";
    }
}

@EqualsAndHashCode

使用 @EqualsAndHashCode 生成对象的 equals()hashCode() 方法,也可以使用 @EqualsAndHashCode.Exclude 注解来不包含某个字段。

// Lombok
@EqualsAndHashCode
public class Example {
    private int age;
    private String name;
}
// 原生Java
public class Example {
    private int age;
    private String name;
    public boolean equals(final Object o) {
        // 省略
        return true;
    }
    public int hashCode() {
        // 省略
        return 0;
    }
}

@ToString@EqualsAndHashCode 如果类中有继承的情况,可以在注解中定义 callSuper 来生成包含调用父类方法的代码。

@NoArgsConstructor

使用 @NoArgsConstructor 来生成无参构造方法。

// Lombok
@NoArgsConstructor
public class Example {
    private int age;
    private String name;
}
// 原生Java
public class Example {
    private int age;
    private String name;
    public Example() {
    }
}

@RequiredArgsConstructor

使用 @RequiredArgsConstructor 来生成含有必须需要初始化参数的参构造方法,比如 final 修饰的字段。

// Lombok
@RequiredArgsConstructor
public class Example {
    private final String name;
    private int age;
}
// 原生Java
public class Example {
    private int age;
    private final String name;
    public Example(String name) {
        this.name = name;
    }
}

@AllArgsConstructor

使用 @AllArgsConstructor 来生成含有所有参数的构造方法。

// Lombok
@AllArgsConstructor
public class Example {
    private String name;
    private int age;
}
// 原生Java
public class Example {
    private String name;
    private int age;
    public Example(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

生成构造方法的注解都可以通过 access 属性来指定构造方法的访问权限。

@Data

@Data 注解是定义实体类最常用的注解,它将常用的注解整合成一个,功能包括:

  • @Getter
  • @Setter
  • @ToString
  • @EqualsAndHashCode
  • @RequiredArgsConstructor
// Lombok
@Data
public class Example {
    private String name;
    private int age;
}
@Getter
@Setter
@ToString
@EqualsAndHashCode
@RequiredArgsConstructor
public class Example {
    private String name;
    private int age;
}

@Builder

@Builder 注解可以生成一个内部类来使用构造器设计模式来给 Java 对象赋值。

// Lombok
@Builder
public class Example {
    private String name;
    private int age;
}
// 原生Java
public class Example {
    private String name;
    private int age;
    Example(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public static ExampleBuilder builder() {
        return new ExampleBuilder();
    }
    public static class ExampleBuilder {
        private String name;
        private int age;
        ExampleBuilder() {
        }
        public ExampleBuilder name(String name) {
            this.name = name;
            return this;
        }
        public ExampleBuilder age(int age) {
            this.age = age;
            return this;
        }
        public Example build() {
            return new Example(name, age);
        }
        public String toString() {
            return "Example.ExampleBuilder(name=" + this.name + ", age=" + this.age + ")";
        }
    }
}

@SneakyThrows

@SneakyThrows 可以对编译时校验的异常进行捕获然后处理。

public class Example {
    // Lombok
    @SneakyThrows
    private void lombok() {
        TimeUnit.MINUTES.sleep(1);
    }
    // 原生Java
    private void example() {
        try {
            TimeUnit.MINUTES.sleep(1L);
        } catch (Throwable e) {
            throw Lombok.sneakyThrow(e);
        }
    }
}

@Synchronized

@Synchronized 可以给方法内部在代码加上 synchronized 同步锁。

public class Example {
    private final Object $lock = new Object[0];
    // Lombok
    @Synchronized
    private void lombok() {
        System.out.println("CodeArtist");
    }
    // 原生Java
    private void example() {
        synchronized (this.$lock) {
            System.out.println("CodeArtist");
        }
    }
}

@Log

@Log 可以在类中定义一个日志变量,它包括生成一系列日志框架的变量的注解,常用的有:

  • @Log
  • @Log4j
  • Slf4j
// Lombok
@Slf4j
public class Example {
}
// 原生Java
public class Example {
    private static final Logger log = org.slf4j.LoggerFactory.getLogger(Example.class);
}


相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
目录
相关文章
|
5月前
|
监控 Java API
现代 Java IO 高性能实践从原理到落地的高效实现路径与实战指南
本文深入解析现代Java高性能IO实践,涵盖异步非阻塞IO、操作系统优化、大文件处理、响应式网络编程与数据库访问,结合Netty、Reactor等技术落地高并发应用,助力构建高效可扩展的IO系统。
167 0
|
6月前
|
资源调度 安全 Java
Java 大数据在智能教育在线实验室设备管理与实验资源优化配置中的应用实践
本文探讨Java大数据技术在智能教育在线实验室设备管理与资源优化中的应用。通过统一接入异构设备、构建四层实时处理管道及安全防护双体系,显著提升设备利用率与实验效率。某“双一流”高校实践显示,设备利用率从41%升至89%,等待时间缩短78%。该方案降低管理成本,为教育数字化转型提供技术支持。
175 1
|
3月前
|
IDE 安全 Java
Lombok 在企业级 Java 项目中的隐性成本:便利背后的取舍之道
Lombok虽能简化Java代码,但其“魔法”特性易破坏封装、影响可维护性,隐藏调试难题,且与JPA等框架存在兼容风险。企业级项目应优先考虑IDE生成、Java Records或MapStruct等更透明、稳健的替代方案,平衡开发效率与系统长期稳定性。
187 1
|
5月前
|
SQL 缓存 安全
深度理解 Java 内存模型:从并发基石到实践应用
本文深入解析 Java 内存模型(JMM),涵盖其在并发编程中的核心作用与实践应用。内容包括 JMM 解决的可见性、原子性和有序性问题,线程与内存的交互机制,volatile、synchronized 和 happens-before 等关键机制的使用,以及在单例模式、线程通信等场景中的实战案例。同时,还介绍了常见并发 Bug 的排查与解决方案,帮助开发者写出高效、线程安全的 Java 程序。
265 0
|
5月前
|
并行计算 Java API
Java List 集合结合 Java 17 新特性与现代开发实践的深度解析及实战指南 Java List 集合
本文深入解析Java 17中List集合的现代用法,结合函数式编程、Stream API、密封类、模式匹配等新特性,通过实操案例讲解数据处理、并行计算、响应式编程等场景下的高级应用,帮助开发者提升集合操作效率与代码质量。
252 1
|
5月前
|
安全 Java API
Java 17 及以上版本核心特性在现代开发实践中的深度应用与高效实践方法 Java 开发实践
本项目以“学生成绩管理系统”为例,深入实践Java 17+核心特性与现代开发技术。采用Spring Boot 3.1、WebFlux、R2DBC等构建响应式应用,结合Record类、模式匹配、Stream优化等新特性提升代码质量。涵盖容器化部署(Docker)、自动化测试、性能优化及安全加固,全面展示Java最新技术在实际项目中的应用,助力开发者掌握现代化Java开发方法。
263 1
|
5月前
|
存储 搜索推荐 算法
Java 大视界 -- Java 大数据在智慧文旅旅游线路规划与游客流量均衡调控中的应用实践(196)
本实践案例深入探讨了Java大数据技术在智慧文旅中的创新应用,聚焦旅游线路规划与游客流量调控难题。通过整合多源数据、构建用户画像、开发个性化推荐算法及流量预测模型,实现了旅游线路的精准推荐与流量的科学调控。在某旅游城市的落地实践中,游客满意度显著提升,景区流量分布更加均衡,充分展现了Java大数据技术在推动文旅产业智能化升级中的核心价值与广阔前景。
|
6月前
|
数据采集 机器学习/深度学习 Java
Java 大视界 —— Java 大数据在智慧交通停车场智能管理与车位预测中的应用实践(174)
本文围绕 Java 大数据在智慧交通停车场智能管理与车位预测中的应用展开,深入剖析行业痛点,系统阐述大数据技术的应用架构,结合大型体育中心停车场案例,展示系统实施过程与显著成效,提供极具实操价值的技术方案。
|
5月前
|
存储 Java 大数据
Java 大视界 —— 基于 Java 的大数据隐私保护在金融客户信息管理中的实践与挑战(178)
本文探讨了基于 Java 的大数据隐私保护技术在金融客户信息管理中的应用与挑战。随着金融行业数字化转型加速,客户信息的安全性愈发重要。文章详细分析了数据加密、脱敏、访问控制、区块链及联邦学习等关键技术,并结合实际案例展示了其在金融机构中的应用效果,为金融科技从业者提供了宝贵的实践经验与技术参考。
|
6月前
|
Java 数据库连接 API
Java 对象模型现代化实践 基于 Spring Boot 与 MyBatis Plus 的实现方案深度解析
本文介绍了基于Spring Boot与MyBatis-Plus的Java对象模型现代化实践方案。采用Spring Boot 3.1.2作为基础框架,结合MyBatis-Plus 3.5.3.1进行数据访问层实现,使用Lombok简化PO对象,MapStruct处理对象转换。文章详细讲解了数据库设计、PO对象实现、DAO层构建、业务逻辑封装以及DTO/VO转换等核心环节,提供了一个完整的现代化Java对象模型实现案例。通过分层设计和对象转换,实现了业务逻辑与数据访问的解耦,提高了代码的可维护性和扩展性。
261 1