| OSC开源社区(ID: oschina2013)
Nicolas Fr nkel是一名高级程序员,拥有近20年的Java开发经验。几年前他开始学习科特林语。之后,每当他再次使用Java时,总会思考为什么自己写的Java代码看起来没有Kotlin那么优雅,发现Java缺少一些可以提高代码可读性、表现力和可维护性的功能。
对此,作为“Kotlin开发者”的Nicolas Fr nkel总结了他认为Java所缺乏的特性:
不可变引用
空安全(空安全)
扩展功能(扩展功能)
的具体化泛型
不可变引用 (Immutable References)
尽管Java允许开发人员定义不可变的引用,但这并不是强制性的。因为默认情况下,引用是可变的。大多数Java代码不使用不可变的引用。
Kotlin不会让开发者选择:每个属性和局部变量都需要定义为aval或avar。此外,Kotlin不支持重新分配的方法参数。
空安全 (Null Safety)
在Java中,没有办法知道一个变量是否为空。基于此,Java 8引入了可选类型。从Java 8开始,返回Optional意味着基值可以为null返回另一个类型意味着否。可选
显然,有些库专注于特定的IDE。此外,库之间几乎没有兼容性。而且有这么多可用的库,人们经常会问用哪一个。
最后,在Java中使用可空性库是可选的。Kotlin要求每个类型可以为空或非空。
val nonnullable : String=computeNonN
ullableString()val nullable: String? = computeNullableString()扩展函数 (Extension Function)
对于以下这段 Java 代码:
class StringUtils {
private StringUtils() {}
static String capitalize(String string) {
return string.substring(, 1).toUpperCase()
+ string.substring(1);
}
}String string = randomString();
String capitalizedString = StringUtils.capitalize(string);
可使用 Kotlin 的扩展函数特性重写为:
fun String.capitalize2(): String {
return substring(, 1).uppercase() + substring(1);
}val string = randomString()val capitalizedString = string.capitalize2()
Kotlin 提供了使用新功能扩展类或接口的能力,而无需从类继承或使用 Decorator 等设计模式。开发者可以通过名为 extensions 的特殊声明来实现它。
例如,开发者可以为无法修改的第三方库中的类或接口编写新函数。这些函数可以以常见的方式进行调用,就好像它们是原始类的方法一样。这种机制称为扩展函数。
具体化的泛型 (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,只有在必要的时候才会使用。
相关