手动编译 lombok
在本文中,我们将看到如何在常规Java代码中使用lombok来最大程度地减少代码长度和冗余。
什么是Lombok?
Lombok,一个编译时注释预处理器,有助于在编译时注入一些代码。 在详细介绍之前,我要求您应该从他们的网站上观看视频。 我不会像这样进行现场演示,但是我将展示如何在项目内部使用它(包括Maven生命周期)。
让我们从基本的了解开始。 如我所知,lombok是一个编译时注释预处理器。 那是什么意思
->它将在编译时起作用(我们可以在编写代码时看到效果)
->我们需要在编译过程中使用类路径进行依赖(使用javac命令执行)
->我们需要插件支持才能在编码时看到IDE中的效果。(因为IDE在编码/保存过程中会进行编译)
Lombok有几个实用程序/功能。 我们将介绍到目前为止我使用过的主要项目。
注意:要了解批注,您可能会看到我的这篇文章。
安装方式
Eclipse:从此链接下载并安装(您需要显示eclipse安装目录)
(我已经检查了STS / eclipse版本:3.7.3.RELEASE)
Intellij IDEA:只需安装lombok插件。 (文件->设置->插件->搜索/浏览以查看,然后安装)
或: 插件链接
现在:基于IDE行为,您可能需要启用注释预处理器才能使插件正常工作。 (通常现代IDE具有此默认设置)
从Eclipse:
IntelliJ IDEA:
项目设置:
我将使用Maven(您可以以相同的方式使用gradle)。 我的Maven版本是3.3.9。
步骤1:在pom.xml中,添加依赖项
dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.16.8</version></dependency>
</dependencies>
您可能会从Maven Central获得更新的版本。
步骤2:如我们所见,lombok是编译时预处理器,因此,我们需要编译器。 因此,在build-> plugins-> plugin内添加maven编译器插件
<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><compilerVersion>1.8</compilerVersion><source>1.8</source><target>1.8</target></configuration>
</plugin>
可以看到,我已经将源和目标版本定义为1.8。
步骤3:现在我们需要添加lombok插件以在项目编译期间工作。 为此,我们需要在插件管理中输入内容,并在构建部分添加带有参数的插件。
<pluginManagement><plugins><plugin><groupId>org.projectlombok</groupId><artifactId>lombok-maven-plugin</artifactId><version>1.16.8.0</version></plugin></plugins>
</pluginManagement>
用参数添加插件
<plugin><groupId>org.projectlombok</groupId><artifactId>lombok-maven-plugin</artifactId><version>1.16.8.0</version><configuration><encoding>UTF-8</encoding></configuration><executions><execution><phase>generate-sources</phase><goals><goal>testDelombok</goal><goal>delombok</goal></goals></execution></executions>
</plugin>
这里的空间说明:
1.编码是必要的
2.您可以看到我使用了2个目标 ,这些是为测试和源范围定义为lombok定义的空间目标。 我同时使用两者,因为我的测试代码也需要lombok。
因此,我的构建部分就是这个。
<build><pluginManagement><plugins><plugin><groupId>org.projectlombok</groupId><artifactId>lombok-maven-plugin</artifactId><version>1.16.8.0</version></plugin></plugins></pluginManagement><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><compilerVersion>1.8</compilerVersion><source>1.8</source><target>1.8</target></configuration></plugin><plugin><groupId>org.projectlombok</groupId><artifactId>lombok-maven-plugin</artifactId><version>1.16.8.0</version><configuration><encoding>UTF-8</encoding></configuration><executions><execution><phase>generate-sources</phase><goals><goal>testDelombok</goal><goal>delombok</goal></goals></execution></executions></plugin></plugins>
</build>
并且,对于日志记录,我们需要具有依赖性。 我将添加所有类型的日志示例。 所以将所有这些加在一起
<!--Logging external dependencies--><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.2</version>
</dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.21</version>
</dependency>
<dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.7.21</version>
</dependency>
<dependency><groupId>org.slf4j</groupId><artifactId>slf4j-ext</artifactId><version>1.7.21</version>
</dependency>
<dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-slf4j-impl</artifactId><version>2.5</version>
</dependency>
因此,最后我的POM的构建部分如下所示 。
现在,该看一下每个功能的用法了:
注意:对于eclipse和IntelliJ,我都使用“大纲视图”来查看效果。 要启用大纲:
Eclipse:窗口->显示视图->大纲
IntelliJ:查看->工具按钮,将进行结构化。
@Getter @Setter:它使带有变量的getter setter变得麻木。 它还支持访问级别参数,以定义获取器和设置器的范围。
参数:采用枚举参数AccessLevel
PUBLIC =公开可用
MODULE,PACKAGE =与默认值相同(不使用任何修饰符) 受保护=与受保护相同 私人=与私人相同 NONE =不会执行
在课堂上:
覆盖类级别的getter: @ToString:这是toString()的实现,我们只能用于类级别。
参数:
includeFieldNames():布尔类型=>定义所有字段包含
callSuper():布尔类型=>调用super
doNotUseGetters():布尔类型=>避免使用字段的获取器。 exclude():字段名称的字符串数组=>定义字段排除 of():字段名称的字符串数组=>定义要添加的字段(显式)
@Data:它是多个注释的组合。
哪里:我们可以在类/类型之前使用
参数:
注意:数据包括
1. @Getter,
2. @Setter。 3. @RequiredArgsConstructor 4. @Tostring 5. @EqualsAndHashCode
范例:
蚀:
IntelliJ:
@Value:这只是@Data的不变值类型。
参数:staticConstructor条目将默认构造函数设为私有
@Builder:在您的班级中添加默认的构建器类。 它只是一个构建器(如带有参数的构建器模式,请参见图像中的示例)
@Singular:用于通知集合(仅支持guava和Java util)。 它包括2种加法器方法,单次添加,全部添加。
val:这使局部最终变量(内部方法)
(紧接在this()或super()之后)
用途:
1.像var(js / c#)一样使用,它将作为最终版本
2.在foreach循环中。
public class ValExample {
val items;public void aMethod() {val store = new Hashtable<String, String>();store.put("one", new String("Shantonu"));val func = store.get("one");System.out.println(func.toLowerCase());store.put("two", "Andrii");store.put("three", "Oleks");for(val v: store.entrySet()){System.out.println("KEY =" +v.getKey()+", VAL = "+ v.getValue());}}
}
@NotNull:这将对变量添加null检查,并引发null指针异常。
使用范围:方法,参数,局部变量
无需检查
与@NotNull
@EqualsAndHashCode:它简单地将equals(Object other)和hashCode()添加到类中。 (因此它是类级别的注释)。
它支持用于自定义这些equals和哈希码方法的参数。 所有参数均与@ToString相同。
@Cleanup:这是清除资源的简单方法。 它实际上确保了资源的close()方法将在try的finally块中被调用。
仅局部变量:
调用资源的关闭方法。 如果您有另一个方法名称,则需要调用value = thatMehtodName(例如exit)
您可以从这里看到一个简单的示例。 无需尝试捕获。
public class CleanupEx {public static void main(String[] args) throws IOException {String pom = System.getProperty("user.dir") + "/pom.xml";String io = System.getProperty("user.dir") + "/logs/io.txt";@Cleanup InputStream in = new FileInputStream(pom);@Cleanup OutputStream out = new FileOutputStream(io);int reading;char c;while ((reading=in.read())!=-1){c=(char)reading;out.write(c);}out.flush();}
}
注意:我认为,当您不关心管理资源时,最好使用此功能。 如果您想按逻辑使用资源,最好避免这种情况。 例如,多线程资源的用法。
使用lombok记录:
@log:这是最好的可用功能之一。 此图显示了要收集的所有记录器。 我在github中的示例将显示详细信息。
我们需要在上课之前设置日志,仅此而已。 它会提供一个静态变量日志,我们可以根据使用的日志类型来使用它。
Parameter:它将主题作为参数,默认情况下是类名。 我们可以设置日志主题。
注意:对于不同的日志实现,我们需要不同类型的配置。 Lombok不提供任何配置帮助,仅注入代码。 因此,我们需要添加取决于我添加的日志类型。
我在github中的示例包含所有6种日志配置类型。 仔细查看pom文件以了解依赖关系以及配置文件的资源。
Lombok示例github链接 :https://github.com/sarkershantonu/practice-projects/tree/master/lombok-examples
注意:由于没有测试范围(空间@Synchronized),我跳过了更多常规功能和实验功能。 我将在github存储库中一个接一个地添加其他内容,并在此处添加参考注释。
翻译自: https://www.javacodegeeks.com/2016/06/lombok-compile-time-java-annotation-preprocessor-minimize-code-size.html
手动编译 lombok