Kotlin开发者眼中的Java缺少哪些特性?

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的更高效的专业化低代码平台,以避免大量繁琐的底层代码带来的工作量。

这个问题可能是由于Kotlin的Kapt编译器插件引起的。Kapt是用于处理Kotlin注解处理器的工具。它可能会在编译过程中遇到问题导致错误。 首先,你可以尝试清理和重新构建项目,看看是否可以解决此问题。你可以使用以下命令清理项目: ``` ./gradlew clean ``` 然后,重新构建项目: ``` ./gradlew build ``` 如果这仍然无法解决问题,你可以尝试以下几个步骤: 1. 确保你的项目中使用的Kotlin版本和Kapt插件版本兼容。你可以在项目的`build.gradle`文件中查看这些版本信息,并确保它们与你的Kotlin代码库兼容。 2. 检查你的代码中是否存在任何错误或不兼容的注解处理器。某些注解处理器可能与Kapt不兼容,导致编译错误。如果有这样的注解处理器,请尝试暂时禁用它们并重新构建项目,看看问题是否得到解决。 3. 如果你最近升级了Kotlin或Kapt版本,请确保所有相关依赖项和插件都已正确更新。有时,版本不匹配可能会导致编译错误。 4. 检查你的项目中是否有任何缺少的依赖项。缺少依赖项可能会导致Kapt无法正常工作。请确保在项目的`build.gradle`文件中包含了所有必要的依赖项。 如果上述步骤都无法解决问题,你可以尝试在Stack Overflow等开发者社区寻求帮助,提供更详细的错误信息和项目配置,以便其他开发者能够更好地理解并解决你的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

捷码小编

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值