原文地址: 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 properties
import 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 数据类型的详情。
个性 | Lombok | Kotlin | 正文 |
---|---|---|---|
Final 类型本地变量 | val | val | val 是 Kotlin 关键字 |
可被重赋值的本地变量 | var | var | var 是 Kotlin 关键字 |
非空变量 | @NonNull | 不须要关键字 | 在 Kotlin,默认类型都是非空,并须要用问号显示申明可为空的变量,如 String? |
主动资源管理(ARM) | @Cleanup | Closeable.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 |
用命名的属性来生成对象 | @Builder | Kotlin 中的命名参数 | Person(name =“Sergey”, age = 25) |
转换 checked 异样到 unchecked 异样 | @SneakyThrows | 所有 Kotlin 代码调用的 checked 异样都是 unchecked 异样 | Kotlin 办法申明了 @Throws,当被 Java 调用时,仍会抛出 checked 异样 |
用锁的同步办法 | @Synchronized | Kotlin withLock 办法。并不齐全一样,但很相近了。另一个好抉择是看看 Kotlin 协程 coroutines | someLock.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