Java开发神器Lombok的使用与原理

您所在的位置:网站首页 安装lomok后@data用不了 Java开发神器Lombok的使用与原理

Java开发神器Lombok的使用与原理

2023-07-16 15:36| 来源: 网络整理| 查看: 265

在面向对象编程中必不可少需要在代码中定义对象模型,而在基于Java的业务平台开发实践中尤其如此。相信大家在平时开发中也深有感触,本来是没有多少代码开发量的,但是因为定义的业务模型对象比较多,而需要重复写Getter/Setter、构造器方法、字符串输出的ToString方法和Equals/HashCode方法等。那么是否一款插件或工具能够替大家完成这些繁琐的操作呢?本文将向大家介绍一款在Eclipse/Intellij IDEA主流的开发环境中都可以使用的Java开发神器,同时简要地介绍下其背后自定义注解的原理。

Lombok的简介

Lombok是一款Java开发插件,使得Java开发者可以通过其定义的一些注解来消除业务工程中冗长和繁琐的代码,尤其对于简单的Java模型对象(POJO)。在开发环境中使用Lombok插件后,Java开发人员可以节省出重复构建,诸如hashCode和equals这样的方法以及各种业务对象模型的accessor和ToString等方法的大量时间。对于这些方法,它能够在编译源代码期间自动帮我们生成这些方法,并没有如反射那样降低程序的性能。

在Intellij中安装Lombok的插件

想要体验一把Lombok的话,得先在自己的开发环境中安装上对应的插件。下面先为大家展示下如何在Intellij中安装上Lombok插件。

通过IntelliJ的插件中心寻找Lombok

从Intellij插件中心安装Lombok

另外需要注意的是,在使用lombok注解的时候记得要导入lombok.jar包到工程,如果使用的是Maven的工程项目的话,要在其pom.xml中添加依赖如下:

org.projectlombok lombok 1.16.8

好了,就这么几步后就可以在Java工程中开始用Lombok这款开发神器了。下文将会给大家介绍Lombok中一些注解的使用方法,让大家对如何用这些注解有一个大致的了解。

Lombok注解使用方法

Lombok常用注解介绍

下面先来看下Lombok中主要几个常用注解介绍:

Lombok的基本使用示例

(1)Val可以将变量申明是final类型。

public static void main(String[] args) { val setVar = new HashSet(); val listsVar = new ArrayList(); val mapVar = new HashMap(); //=>上面代码相当于如下: final Set setVar2 = new HashSet(); final List listsVar2 = new ArrayList(); final Map maps2 = new HashMap();}

(2)@NonNull注解能够为方法或构造函数的参数提供非空检查。

public void notNullExample(@NonNull String string) { //方法内的代码}//=>上面代码相当于如下:public void notNullExample(String string) { if (string != null) { //方法内的代码相当于如下: } else { throw new NullPointerException("null"); }}

(3)@Cleanup注解能够自动释放资源。

public void jedisExample(String[] args) { try { @Cleanup Jedis jedis = redisService.getJedis(); } catch (Exception ex) { logger.error(“Jedis异常:”,ex) } //=>上面代码相当于如下: Jedis jedis= null; try { jedis = redisService.getJedis(); } catch (Exception e) { logger.error(“Jedis异常:”,ex) } finally { if (jedis != null) { try { jedis.close(); } catch (Exception e) { e.printStackTrace(); } } }}

(4)@Getter/@Setter注解可以针对类的属性字段自动生成Get/Set方法。

public class OrderCreateDemoReq{ @Getter @Setter private String customerId; @Setter @Getter private String poolId; //其他代码……}//上面请求Req类的代码相当于如下:public class OrderCreateDemoReq{ private String customerId; private String poolId; public String getCustomerId(){ return customerId; } public String getPoolId(){ return poolId; } public void setCustomerId(String customerId){ this.customerId = customerId; } public void setPoolId(String poolId){ this.pool = pool; }}

(5)@ToString注解,为使用该注解的类生成一个toString方法,默认的toString格式为:ClassName(fieldName= fieleValue ,fieldName1=fieleValue)。

@ToString(callSuper=true,exclude="someExcludedField")public class Demo extends Bar { private boolean someBoolean = true; private String someStringField; private float someExcludedField;}//上面代码相当于如下:public class Demo extends Bar { private boolean someBoolean = true; private String someStringField; private float someExcludedField; @ Override public String toString() { return "Foo(super=" + super.toString() + ", someBoolean=" + someBoolean + ", someStringField=" + someStringField + ")"; }}

(6)@EqualsAndHashCode注解,为使用该注解的类自动生成equals和hashCode方法。

@EqualsAndHashCode(exclude = {"id"}, callSuper =true)public class LombokDemo extends Demo{ private int id; private String name; private String gender;}//上面代码相当于如下:public class LombokDemo extends Demo{ private int id; private String name; private String gender; @Override public boolean equals(final Object o) { if (o == this) return true; if (o == null) return false; if (o.getClass() != this.getClass()) return false; if (!super.equals(o)) return false; final LombokDemo other = (LombokDemo)o; if (this.name == null ? other.name != null : !this.name.equals(other.name)) return false; if (this.gender == null ? other.gender != null : !this.gender.equals(other.gender)) return false; return true; } @Override public int hashCode() { final int PRIME = 31; int result = 1; result = result * PRIME + super.hashCode(); result = result * PRIME + (this.name == null ? 0 : this.name.hashCode()); result = result * PRIME + (this.gender == null ? 0 : this.gender.hashCode()); return result; }}

(7) @NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor,这几个注解分别为类自动生成了无参构造器、指定参数的构造器和包含所有参数的构造器。

@RequiredArgsConstructor(staticName = "of") @AllArgsConstructor(access = AccessLevel.PROTECTED) public class ConstructorExample { private int x, y; @NonNull private T description; @NoArgsConstructor public static class NoArgsExample { @NonNull private String field; } }//上面代码相当于如下:@RequiredArgsConstructor(staticName = "of") @AllArgsConstructor(access = AccessLevel.PROTECTED) public class ConstructorExample { private int x, y; @NonNull private T description; @NoArgsConstructor public static class NoArgsExample { @NonNull private String field; } }public class ConstructorExample { private int x, y; @NonNull private T description; private ConstructorExample(T description) { if (description == null) throw new NullPointerException("description"); this.description = description; } public static ConstructorExample of(T description) { return new ConstructorExample(description); } @java.beans.ConstructorProperties({"x", "y", "description"}) protected ConstructorExample(int x, int y, T description) { if (description == null) throw new NullPointerException("description"); this.x = x; this.y = y; this.description = description; } public static class NoArgsExample { @NonNull private String field; public NoArgsExample() { } } }

(8)@Data注解作用比较全,其包含注解的集合@ToString,@EqualsAndHashCode,所有字段的@Getter和所有非final字段的@Setter, @RequiredArgsConstructor。其示例代码可以参考上面几个注解的组合。

(9)@Builder注解提供了一种比较推崇的构建值对象的方式。

@Builder public class BuilderExample { private String name; private int age; @Singular private Set occupations; }//上面代码相当于如下:public class BuilderExample { private String name; private int age; private Set occupations; BuilderExample(String name, int age, Set occupations) { this.name = name; this.age = age; this.occupations = occupations; } public static BuilderExampleBuilder builder() { return new BuilderExampleBuilder(); } public static class BuilderExampleBuilder { private String name; private int age; private java.util.ArrayList occupations; BuilderExampleBuilder() { } public BuilderExampleBuilder name(String name) { this.name = name; return this; } public BuilderExampleBuilder age(int age) { this.age = age; return this; } public BuilderExampleBuilder occupation(String occupation) { if (this.occupations == null) { this.occupations = new java.util.ArrayList(); } this.occupations.add(occupation); return this; } public BuilderExampleBuilder occupations(Collection


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3