共计 1811 个字符,预计需要花费 5 分钟才能阅读完成。
Nicolas Fränkel 是一名资深程序员,领有近二十年的 Java 开发经验。他在几年前开始学习 Kotlin,在此之后,每当他再应用 Java 时,总会思考为什么本人写的 Java 代码,看起来不如 Kotlin 那么优雅,并且发现 Java 短少一些能够晋升代码可读性、表现力和可维护性的性能。对此,Nicolas Fränkel 以“Kotlin 开发者”身份总结了他认为 Java 短少的个性:
·不可变援用 (Immutable References)
·空平安 (Null Safety)
·扩大函数 (Extension Function)
·具体化的泛型 (Reified Generics)
1. 不可变援用 (Immutable References)
尽管 Java 容许开发者定义不可变援用,但这不是强制性的。因为默认状况下,援用是可变的,但大多数 Java 代码并没有利用不可变援用。
Kotlin 不会让开发者抉择:每个属性和局部变量都须要定义为 a val 或 a var。另外,Kotlin 不反对重新分配办法参数。
2. 空平安 (Null Safety)
在 Java 中,无奈晓得变量是否为 null。基于此,Java 8 引入了 Optional 类型。从 Java 8 开始,返回 Optional 意味着根底值能够是 null;返回另一种类型则意味着不是。
Optional
显然,有些库专一于特定的 IDE。此外,库之间简直不兼容。而且可供使用的库太多了,以至于常常有人会询问该应用哪一个。
最初,在 Java 中应用可空性库是可选的。而 Kotlin 则要求每种类型都能够为空或不可为空。
val nonNullable: String = computeNonNullableString()val nullable: String? = computeNullableString()
3. 扩大函数 (Extension Function)
对于以下这段 Java 代码:
class StringUtils {
private StringUtils() {}
static String capitalize(String string) {return string.substring(0, 1).toUpperCase()
+ string.substring(1);
}
}String string = randomString();
String capitalizedString = StringUtils.capitalize(string);
可应用 Kotlin 的扩大函数个性重写为:
fun String.capitalize2(): String {
return substring(0, 1).uppercase() + substring(1);
}val string = randomString()val capitalizedString = string.capitalize2()
Kotlin 提供了应用新性能扩大类或接口的能力,而无需从类继承或应用 Decorator 等设计模式。开发者能够通过名为 extensions 的非凡申明来实现它。
例如,开发者能够为无奈批改的第三方库中的类或接口编写新函数。这些函数能够以常见的形式进行调用,就如同它们是原始类的办法一样。这种机制称为扩大函数。
4. 具体化的泛型 (Reified Generics)
举个例子,如何从值的容器中获取类型化的值。上面是 Spring 的示例:
org/springframework/beans/factory/BeanFactory.java
public interface BeanFactory {
<T> T getBean(Class<T> requiredType);
}
开发者增加了一个 Class<T> 参数,以便可能晓得办法体中的类型。但如果 Java 曾经具体化了泛型,那就能够这样写:
public interface BeanFactory {
<T> T getBean();
}
如果 Kotlin 曾经具体化了泛型:
interface BeanFactory {fun <T> getBean(): T
}
并调用函数:
val factory = getBeanFactory()val anyBean = getBean<Any>()
Nicolas Fränkel 示意,Kotlin 已成为他在 JVM 上的首选编程语言,至于 Java,只有在必要的时候才会应用。更多时候,他们更偏向于应用基于 Java 的更高效的专业化低代码平台,以防止大量繁琐的底层代码带来的工作量。