Lombok,一种编译时Java注释预处理器,可最大程度地减少代码大小

在本文中,我们将看到如何在常规Java代码中使用lombok来最小化代码长度和冗余。

什么是Lombok?

Lombok,一个编译时注释预处理器,有助于在编译时注入一些代码。 在详细介绍之前,我要求您应该从他们的网站上观看视频。 我不会像这样进行现场演示,但是我将展示如何在项目内部使用它(包括Maven生命周期)。

让我们从基本的了解开始。 如我所知,lombok是一个编译时注释预处理器。 那是什么意思

->它将在编译时起作用(我们可以在编写代码时看到效果)
->在编译过程中(使用javac命令执行)我们需要类路径中的依赖项
->我们需要插件支持才能在编码时看到IDE的效果。(因为IDE在编码/保存过程中会进行编译)

Lombok有几个实用程序/功能。 我们将介绍到目前为止我使用过的主要项目。

注意:要了解批注,您可能会看到我的这篇文章。

安装方式:

Eclipse:从此链接下载并安装(您需要显示eclipse安装目录)

shantonu_Selection_050

shantonu_Selection_051

(我已经检查了STS / eclipse版本:3.7.3.RELEASE)

Intellij IDEA:只需安装lombok插件。 (文件->设置->插件->搜索/浏览以查看,然后安装)

或: 插件链接

现在:基于IDE行为,您可能需要启用注释预处理器才能使插件正常工作。 (通常现代IDE具有此默认设置)

从Eclipse:

shantonu_Selection_058

IntelliJ IDEA:

shantonu_Selection_057

项目设置:

我将使用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变得麻木。 它还支持访问级别参数,以定义getter和setter的范围。

参数:采用枚举参数AccessLevel
PUBLIC =可公开访问
MODULE,PACKAGE =与默认值相同(不使用任何修饰符) 受保护=与受保护相同 私人=与私人相同 NONE =不会执行

shantonu_Selection_054

在课堂上:
shantonu_Selection_055
覆盖类级别的getter: shantonu_Selection_056 @ToString:这是toString()的实现,我们只能用于类级别。

参数:

includeFieldNames():布尔类型=>定义所有字段包含
callSuper():布尔类型=>调用super
doNotUseGetters():布尔类型=>避免使用字段的获取器。 exclude():字段名称的字符串数组=>定义字段排除 of():字段名称的字符串数组=>定义要添加的字段(显式)

shantonu_Selection_059

@Data:它是多个注释的组合。
哪里:我们可以在类/类型之前使用

参数:

注意:数据包括
1. @Getter,
2. @Setter。 3. @RequiredArgsConstructor 4. @Tostring 5. @EqualsAndHashCode

范例:

蚀:
shantonu_Selection_052

IntelliJ:

shantonu_Selection_053

@Value:这只是@Data的不可变值类型。

参数:staticConstructor条目将默认构造函数设为私有

shantonu_Selection_070

@Builder:向您的班级添加默认的构建器类。 它只是一个构建器(如构建器模式,带有参数,请参见图像中的示例)

@Singular:用于通知集合(仅支持guava和Java util)。 它包括2种加法器方法,一次添加,全部添加。
shantonu_Selection_069

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());}}
}

shantonu_Selection_069
@NotNull:这将对变量添加null检查,并引发null指针异常。

使用范围:方法,参数,局部变量

无需检查
shantonu_Selection_065

与@NotNull

shantonu_Selection_066

@EqualsAndHashCode:它简单地将equals(Object other)和hashCode()添加到类中。 (因此它是类级别的注释)。

它支持参数以自定义那些equals和哈希码方法。 所有参数均与@ToString相同。

shantonu_Selection_071

@Cleanup:这是清理资源的简单方法。 实际上,它确保资源try()方法将在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文件,以了解依赖关系以及配置文件的资源。

shantonu_Selection_060

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/353363.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

css3实现雷达图

效果图&#xff1a;gif图&#xff1a;代码&#xff1a;<!DOCTYPE html> <html > <head> <meta charset"UTF-8"> <meta http-equiv"X-UA-Compatible" content"IEEdge,chrome1"/> <meta name"viewpor…

STL set

STL set 百科名片 STL 对这个序列可以进行查找&#xff0c;插入删除序列中的任意一个元素&#xff0c;而完成这些操作的时间同这个序列中元素个数的对数成比例关系&#xff0c;并且当游标指向一个已删除的元素时&#xff0c;删除操作无效。而一个经过更正的和更加实际的定义应该…

一、Objective-C之Runtime的概念

前一篇关于NSProxy代理涉及到的关于消息转发&#xff0c;把以前写的runtime文章从github上转移过来。一共三篇&#xff0c;似乎自己也忘记了一些runtime的细节&#xff0c;需要温故一下。 一、什么是Objc的Runtime&#xff1f; Runtime是Objc语言的磐石&#xff0c;Objc语言得以…

jsf服务_使用JSF的面向服务的UI

jsf服务在大型软件开发项目中&#xff0c;面向服务的体系结构非常常见&#xff0c;因为它提供了可供不同团队或部门使用的功能接口。 创建用户界面时&#xff0c;应应用相同的原理。 对于具有开票部门和客户管理部门等的大型公司&#xff0c;组织结构图可能如下所示&#xff1a…

ANTLR和Jetbrains MPS:解析文件并以树符号显示AST

Itemis再次这样做&#xff1a;他们刚刚为Jetbrains MPS发布了一个非常酷的新插件。 这允许定义新的树编辑器。 他们看起来像这样&#xff1a; 在这篇文章中&#xff0c;我们将看到&#xff1a; 如何在MPS中使用ANTLR解析器 如何使用树符号表示已解析的AST 特别是&#xf…

KMP字符串模式匹配详解

刚看到位兄弟也贴了份KMP算法说明&#xff0c;但本人觉得说的不是很详细&#xff0c;当初我在看这个算法的时候也看的头晕昏昏的&#xff0c;我贴的这份也是网上找的。且听详细分解&#xff1a;KMP字符串模式匹配详解 来自CSDN A_B_C_ABC 网友 KMP字符串模式匹配通俗点说…

ASP.NET Core IdentityServer4 新手上路

OAuth2.0资料 今天看到一篇博主写了该系列文章,贴图和过程都比较详细,俗话说实践是检验真理的唯一标准&#xff08;如果是按照参考文章复制粘贴,应该不会出现踩坑&#xff0c;但是我喜欢自己手动敲一遍&#xff09;&#xff0c;发现几个坑&#xff0c;因而总结下经验&#xff0…

主成分分析和因子分析区别与联系

主成分分析可以简单的总结成一句话&#xff1a;数据的压缩和解释。常被用来寻找判断某种事物或现象的综合指标&#xff0c;并且给综合指标所包含的信息以适当的解释。在实际的应用过程中&#xff0c;主成分分析常被用作达到目的的中间手段&#xff0c;而非完全的一种分析方法。…

luogu P1519 穿越栅栏 Overfencing

题目描述 描述 农夫John在外面的田野上搭建了一个巨大的用栅栏围成的迷宫。幸运的是&#xff0c;他在迷宫的边界上留出了两段栅栏作为迷宫的出口。更幸运的是&#xff0c;他所建造的迷宫是一个“完美的”迷宫&#xff1a;即你能从迷宫中的任意一点找到一条走出迷宫的路。给定迷…

css实现简单的告警提示动画效果

需求&#xff1a;css实现简单的告警提示动画效果&#xff0c;当接收到实时信息的时候&#xff0c;页面弹出告警信息的动画效果<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>css实现告警提示动画</…

程序员的八个级别

2009年4月6日 陈皓 在面试时&#xff0c;你可能会被经常问到“在未来5年&#xff0c;你想干什么&#xff1f;”&#xff0c;这可能是一个比较难回答的问题。在中国&#xff0c;答案一般可能会是Team leader&#xff0c;Manager&#xff0c;或是Architect&#xff0c;Specialist…

一个具有Spring Boot,Spring Security和Stormpath的简单Web应用程序-15分钟

建筑物身份管理&#xff0c;包括身份验证和授权&#xff1f; 尝试Stormpath&#xff01; 我们的REST API和强大的Java SDK支持可以消除您的安全风险&#xff0c;并且可以在几分钟内实现。 注册 &#xff0c;再也不会建立auth了&#xff01; 更新 &#xff1a;我们最近发布了对…

javafx2_JavaFX 2 GameTutorial第5部分

javafx2介绍 这是与JavaFX 2 Game Tutorial相关的六部分系列的第五部分。 我知道自从我写关于游戏的博客以来已经有很长时间了&#xff0c;但希望您仍然与我在一起。 如果您想回顾一下&#xff0c;请阅读第1部分 &#xff0c; 第2 部分 &#xff0c; 第3 部分和第4 部分 &#…

史上最简单的SpringCloud教程 | 第二篇: 服务消费者(rest+ribbon)(Finchley版本)

转载请标明出处&#xff1a; 原文首发于&#xff1a;https://www.fangzhipeng.com/springcloud/2018/08/30/sc-f2-ribbon/ 本文出自方志朋的博客 在上一篇文章&#xff0c;讲了服务的注册和发现。在微服务架构中&#xff0c;业务都会被拆分成一个独立的服务&#xff0c;服务与服…

忽略已检查的异常,所有出色的开发人员都在这样做–基于600,000个Java项目

Github和Sourceforge上超过600,000个Java项目中的异常处理概述 Java是使用检查异常的少数语言之一。 它们在编译时强制执行&#xff0c;并且需要某种处理。 但是……实践中会发生什么&#xff1f; 大多数开发人员实际上处理任何事情吗&#xff1f; 以及他们如何做到的&#xf…

使用Boxfuse轻松在云中运行Spring Boot应用程序

几天前&#xff0c;我开始构建一个将使用REST API检索和存储数据的iOS应用。 该REST API将是我也必须构建的服务器应用程序。 由于我熟悉Java和Spring &#xff0c;因此决定使用Spring Boot作为框架。 为了能够在我的iPhone上使用它&#xff0c;如果我可以在服务器而不是我自己…

numpy的使用数组的创建2

随机创建了长度为十的数组 获得十以类的随机整数 快速获取数组2乘3维的数组 生成20个1到10之间的数组 通过reshape 将这些数变成二位数组 shape这个方法可以查看数组中的元素是几行几列的 转载于:https://www.cnblogs.com/chenligeng/p/9315339.html

Tabs vs Spaces:如何在Google,Twitter,Mozilla和Pied Piper上编写Java

流行的Java代码样式中最有趣的亮点是什么&#xff1f; 尽管上面有暗示性的形象&#xff0c;我们也不想发动任何不必要的圣战。 当归结为编码样式时&#xff0c;大多数选择都是相当随意的&#xff0c;并取决于个人喜好。 是的&#xff0c;即使在编辑器之间制表符宽度改变了&…

ES group分组聚合的坑

参考链接&#xff1a;https://blog.csdn.net/u010454030/article/details/71762838 ES group分组聚合的坑 原来知道Elasticsearch在分组聚合时有一些坑但没有细究&#xff0c;今天又看了遍顺便做个笔记和大家分享一下。 我们都知道Elasticsearch是一个分布式的搜索引擎&#xf…