原文地址: https://dzone.com/articles/mi...

更短的代码不是目标,只有更可读的代码才是

作为一个Java开发者,最常见的埋怨是对Java语言简短的埋怨。而其中呈现最多的就是数据类。 数据类,或者元祖,或者record记录类,将来在Java语言可能会隐没,但在那天之前,任何工夫创立一个rest dto, jpa实体,畛域对象,或者任何相似的,Java的冗余就呈现了。在这篇文章里,我会介绍如何从Lombok迁徙到Kotlin,以及从迁徙中能取得的收益。

// 40 Lines of Java code for a class with 2 propertiesimport java.time.LocalDate;import java.util.Objects;public class Person { private String name; private LocalDate dateOfBirth; public Person(String name, LocalDate dateOfBirth) { this.name \= name; this.dateOfBirth \= dateOfBirth; } public String getName() { return name; } public LocalDate getDateOfBirth() { return dateOfBirth; } @Override public boolean equals(Object o) { if (this \== o) return true; if (o \== null || getClass() != o.getClass()) return false; Person person \= (Person) o; return Objects.equals(name, person.name) && Objects.equals(dateOfBirth, person.dateOfBirth); } @Override public int hashCode() { return Objects.hash(name, dateOfBirth); } @Override public String toString() { return "Person{" + "name='" + name + '\\'' + ", dateOfBirth=" + dateOfBirth + '}'; }}

要无效的应用数据类,你常常须要一组属性;一个构造函数,一组getter;兴许也会有equals; hashcode和toString办法;另外在一些状况下,还有邪恶的setter到处都是。因为这是个常见问题,一些解决方案呈现了 - Lombok是比拟出名的,但其余还有AutoValue与Immutables。

尽管如此,在这篇博文中,我会次要介绍从Lombok迁徙到Kotlin,因为这是一个从Kotlin开始的好机会,危险很低并且很容易了解,加上Kotlin提供比Java更多的益处,迁徙到Kotlin数据类型是一个能够让你代码库开始适配Kotlin的好开始。

小申明:只管这篇文章次要介绍迁徙到Kotlin,我并没有说Lombok不好。它为规范Java代码提供了很多帮忙。这仅仅是介绍如何在Lombok应用的中央来应用Kotlin。

什么是Lombok?

对于不相熟Lombok的人,Lombok是一个移除了Java代码冗余的生成类库。比方,在以下类,用Lombok类库,代码可能看起来是这样:

`
import java.time.LocalDate;

import lombok.Value;

@Value

public class Person {

private String name;

private LocalDate dateOfBirth;

}
`

这更好,不是吗? @Value申明,为类创立了有两个参数的final 结构类,get办法,equals,hashcode和toString办法。

什么是Kotlin?

因为下面绝对于原生代码曾经是一个微小的改良了,这片文章次要介绍迁徙到Kotlin。上面看,咱们的初始例子能够被Kotlin重写成这样:

``data class Person(val name: String, val dateOfBirth: LocalDate)
``
这段代码做的与Lombok一样,生成了构造函数,一个toString, equals/hashcode这些。

因为这更短,更短的代码并不是指标。而代码的可读性才是外围。在这个例子里,有人能够说两段代码的可读性一样,我也批准。只管这样,通过引入Kotlin版本,同样的可读性一样是个迁徙到Kotlin的好起因。以上代码能100%与其余的Java代码互操作。因而,将Kotlin引入到代码中不会有很大组里。

Lombok迁徙Kotlin指南

以上只是个小例子,上面的表格展现了一个残缺的如何迁徙到Kotlin数据类型的详情。

个性LombokKotlin正文
Final类型本地变量valvalval是Kotlin关键字
可被重赋值的本地变量varvarvar是Kotlin关键字
非空变量@NonNull不须要关键字在Kotlin,默认类型都是非空,并须要用问号显示申明可为空的变量,如String?
主动资源管理(ARM)@CleanupCloseable.use例子: val result = FileInputStream("input.txt").use{input->//Process input}
生成get和set@Getter/@Setter通过数据类中申明属性为var实现如:data class Person(var name: String) 生成了 Person name的get和set.
生成toString@ToString数据类的一部分如:data class Person(var name: String) 生成了toString
生成equals和hashcode办法@EqualsAndHashCode数据类的一部分如:data class Person(val name: String) 主动生成了Person的equas和toString 办法。
生成无参构造函数@NoArgsConstructor数据类提供,给所有参数一个默认值或引入一个第二构造函数如:data class Person(val name: String = “”) 将一个默认值赋给了name并且生成了一个默认无参构造函数 或者,用一个第二构造函数: data class Person(var name: String) {   constructor() : this(“”) }
生成与属性数量统一的带参数构造函数@RequiredArgsConstructor and @AllArgsConstructor数据类型的一部分例如:data class Person(val name: String) 主动为所有参数生成了构造函数
生成不可见数据类@Data数据类一部分,通过在属性上应用var申明data class Person(var name: String)
主动生成了toString, hashCode, equals, 等
生成一个不可变数据类@Value数据类一部分,通过在属性上申明val如:data class Person(var name: String)生成了Person的toString
用命名的属性来生成对象@BuilderKotlin中的命名参数Person(name = “Sergey”, age = 25)
转换checked异样到unchecked异样@SneakyThrows所有Kotlin代码调用的checked异样都是unchecked异样Kotlin办法申明了@Throws,当被Java调用时,仍会抛出checked异样
用锁的同步办法@SynchronizedKotlin withLock 办法。并不齐全一样,但很相近了。另一个好抉择是看看Kotlin协程coroutinessomeLock.withLock {    sharedResource.operation()}
提早加载属性@Getter(lazy=true)委托属性`by lazy`
主动logger@Log无内置选项但marker interface能够让这个属性更容易实现

就像上表看到的,大多数Lombok个性都可在Kotlin实现。其实,让Lombok最平凡的起因就是灵便。例如,很容易为一个类减少toString办法,而不必减少Equals/HashCode办法。在Kotlin,则没这么容易。

实际中,只须要一个toString办法,可能不太常见,不过这就是让你理解下Lombok比Kotlin更灵便一点。

如果给工程减少Kotlin反对

要开始迁徙,你须要给你的工程减少Kotlin反对。你能够简略这样给Maven加adding Kotlin support to your Maven project, 或给Gradle加adding Kotlin support to your Gradle project.

同时应用Kotlin和Lombok不是个好主见,因为Kotlin源码编译与Lombok代码生成是在同一个时间段。后果,Kotlin代码不能应用Lombok生成的办法。你能够通过将代码放入一个独立工程来长期解决,但我倡议彻底迁徙,或者跟我做的一样,你能够给工程去LombokdeLombok the project 并缓缓迁徙到Kotlin。应用什么办法取决于你工程的大小,但对于咱们,最简略的就是去掉Lombok并转换到Kotlin。

论断

我心愿通过这篇文章能将Kotlin引入你的我的项目。它应该是一个平安并可读的转换,提供了将来引入其余高级Kotlin个性的可能,比方协程,Kotlin类型平安DSL或其余的个性。


来自时序的博客
微信公众号「麦芽面包」,id「darkjune_think」
开发者/科幻爱好者/硬核主机玩家/业余翻译
交换Email: zhukunrong@yeah.net