Java 项目 Lombok

Project Lombok是一个非常有用的工具,可用于减少Java项目中的样板代码。

问题陈述

java project lombok
package com.askrakesh.java.manage_boilerplate;

import java.time.LocalDate;

public class Person {

	String firstName;
	String lastName;
	LocalDate dateOfBirth;

	public Person(String firstName, String lastName, LocalDate dateOfBirth) {
		super();
		this.firstName = firstName;
		this.lastName = lastName;
		this.dateOfBirth = dateOfBirth;
	}

	public String getFirstName() {
		return firstName;
	}

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

	public String getLastName() {
		return lastName;
	}

	public void setLastName(String lastName) {
		this.lastName = lastName;
	}

	public LocalDate getDateOfBirth() {
		return dateOfBirth;
	}

	public void setDateOfBirth(LocalDate dateOfBirth) {
		this.dateOfBirth = dateOfBirth;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((dateOfBirth == null) ? 0 : dateOfBirth.hashCode());
		result = prime * result + ((firstName == null) ? 0 : firstName.hashCode());
		result = prime * result + ((lastName == null) ? 0 : lastName.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Person other = (Person) obj;
		if (dateOfBirth == null) {
			if (other.dateOfBirth != null)
				return false;
		} else if (!dateOfBirth.equals(other.dateOfBirth))
			return false;
		if (firstName == null) {
			if (other.firstName != null)
				return false;
		} else if (!firstName.equals(other.firstName))
			return false;
		if (lastName == null) {
			if (other.lastName != null)
				return false;
		} else if (!lastName.equals(other.lastName))
			return false;
		return true;
	}

	@Override
	public String toString() {
		return "Person [firstName=" + firstName + ", lastName=" + lastName + "dateOfBirth=" + dateOfBirth + "]";
	}

}

一个类应该为实例变量提供getter-setter方法,实现equals和hashCode方法,提供所有字段的构造函数,并实现toString方法。这个类目前没有业务逻辑,即使没有业务逻辑,代码也有80多行。这太荒谬了。

项目龙卜克

Project Lombok是一个Java库,可自动与您的编辑器和构建工具进行连接,并帮助减少样板代码。让我们先了解如何设置Lombok项目。

Java 项目 Lombok 的工作原理是怎样的?

Lombok在我们的代码中有各种可以使用的注解,这些注解在编译时被处理,并且根据使用的注解进行适当的代码扩展。Lombok只对代码进行视图时间的减少,在编译之后,字节码注入了所有的样板代码。这有助于保持我们的代码库小,简洁,易读和易于维护。

Lombok 项目 Maven

在你的项目中添加Lombok很简单。只需在你的maven项目的pom.xml文件中添加下面的依赖。

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

在IDE(Eclipse)中添加Lombok插件。

以下是Windows的安装步骤:

    1. 从https://projectlombok.org/download下载jar文件,或使用从maven构建下载的jar文件。

 

    1. 在终端中执行以下命令:java -jar lombok.jar

 

    该命令将打开一个窗口,如下图所示,请安装并退出安装程序,然后重新启动eclipse。
java lombok install eclipse
    1. 将lombok.jar复制到Eclipse.app/Contents/MacOS目录中。

 

    1. 在Eclipse.app/Contents/Eclipse/eclipse.ini文件的末尾添加-javaagent:lombok.jar。

 

    重新启动Eclipse,并在项目属性中启用“注解处理”,如下图所示。

在Eclipse的大纲中浏览Lombok的信息。

project lombok eclipse getter setter annotations

Lombok在Java字节码中的窥视

project lombok annotations runtime

Project Lombok 注释

Project Lombok提供了许多注解,有助于减少各种场景中的样板代码。让我们看一些例子。

    1. 构造函数注解

 

    1. @AllArgsConstructor

 

    1. public class PersonLombok {

 

    1. @NonNull String firstName;

 

    1. String lastName;

 

    1. LocalDate dateOfBirth;

 

    1. public static void main(String[] args) {

 

    1. new PersonLombok(null, “Kumar”, LocalDate.now());

 

    1. }

 

    1. }

以上代码在类中注入以下内容:

使用@AllArgsConstructor注解的带有所有参数的构造函数
在传递参数到构造函数时进行空值检查,使用@NonNull。在将参数作为方法参数传递时,也可以使用@NonNull注解。

程序运行结果如下。使用@RequiredArgsConstructor生成一个构造函数,为每个需要特殊处理的字段生成一个参数。所有未初始化的final字段都会生成一个参数,以及任何被标记为@NonNull但在声明时未初始化的字段。

获取器/设置器注解
这些注解可以在字段或类级别使用。如果您想要细粒度控制,则在字段级别使用。当在类级别使用时,会创建所有的getter/setter方法。让我们继续处理上面创建的类。
@AllArgsConstructor @Getter @Setter
public class PersonLombok {
String firstName;
String lastName;
LocalDate dateOfBirth;
}

equals,hashCode和toString注解
在创建类时,建议重写hashCode()和equals()方法。在Lombok中,我们有@EqualsAndHashCode注解,它会注入equals()和hashCode()方法的代码,因为它们是相互关联的。另外,@ToString注解提供了toString()的实现。让我们看看这个:
@AllArgsConstructor @Getter @Setter
@EqualsAndHashCode
@ToString
public class PersonLombok {
String firstName;
String lastName;
LocalDate dateOfBirth;
}

现在,我们使用Lombok注解创建了Person类,没有任何样板代码。然而,情况变得更好,我们可以用@Data替换上述类中使用的所有注解,并获得相同的功能。

基于设计模式的注解
@Builder允许您自动生成使用构建器模式实例化类所需的代码。
@Builder
public class Employee {
String firstName;
String lastName;
LocalDate dateOfBirth;

public static void main(String[] args) {
Employee emp = new EmployeeBuilder().firstName(“Rakesh”)
.lastName(“Kumar”)
.dateOfBirth(LocalDate.now())
.build();
}
}

@Delegate生成将调用委托给使用该注解的字段的委托方法。遵循“优先使用组合而不是继承”的原则,但这会创建很多类似适配器模式的样板代码。在实现此功能时,Lombok参考了相同名称的Groovy注解。让我们看一个实现:
@RequiredArgsConstructor
public class AdapterImpl implements Adapter {
@Delegate
private final Adaptee instance;

public static void main(String[] args) {
AdapterImpl impl = new AdapterImpl(new Adaptee());
impl.display();
}
}

接口适配器 {
public void display();
}

class Adaptee {
public void display() {
System.out.println(“In Adaptee.display()”);
}
}

Lombok提供了所有注解的细粒度控制功能。

模板:Java架构师在听吗?

是的,它们是这样的。你需要明白,与其他语言不同,Java 在升级语言方面非常小心,以免破坏任何使用旧版本 Java 的现有代码库。这本身就是一项巨大的任务,不能忽视。他们已经在语言中修改和构建更好的类型推断功能,并已推出。Java 10 计划中的一个重要功能是局部变量类型推断。尽管该功能与添加动态类型更有关系,而不是减少样板代码,但对于管理样板代码来说,它只是沧海一粟。

总结

减少样板代码有助于提高可读性,更少的代码也意味着更少的错误。项目Lombok在几乎所有主要组织中广泛使用。我们为您提供了来自Lombok的最有用的功能。希望您尝试一下。源代码:您可以访问我的Github链接来下载本教程中使用的完整源代码。

广告
将在 10 秒后关闭
bannerAds