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

上一篇 / 下一篇  2022-06-15 10:41:29

  Nicolas Fr nkel 是一名资深程序员,拥有近二十年的 Java 开发经历。他在几年前开始学习 Kotlin,在此之后,每当他再使用 Java 时,总会思考为什么自己写的 Java 代码看起来不如 Kotlin 那么优雅,并且发现 Java 缺少一些可以提升代码可读性、表现力和可维护性的功能。
  对此,Nicolas Fr nkel 以 “Kotlin 开发者” 身份总结了他认为 Java 缺少的特性:
  ·不可变引用 (Immutable References)
  · 空安全 (Null Safety)
  · 扩展函数 (Extension Function)
  · 具体化的泛型 (Reified Generics)
  不可变引用 (Immutable References)
  虽然 Java 允许开发者定义不可变引用,但这不是强制性的。因为默认情况下,引用是可变的。大多数 Java 代码没有利用不可变引用。
  Kotlin 不会让开发者选择:每个属性和局部变量都需要定义为 aval? 或 a var。另外,Kotlin 不支持重新分配方法参数。
  空安全 (Null Safety)
  在 Java 中,无法知道变量是否为 null?。基于此,Java 8 引入了 Optional?类型。从 Java 8 开始,返回 Optional? 意味着基础值可以是 null?; 返回另一种类型则意味着不是。但是,Optional 开发者仅将其设计为返回值。方法参数和返回值的语言语法中没有可用的内容。为了解决这个问题,许多库提供了编译时注释。
  显然,有些库专注于特定的 IDE。此外,库之间几乎不兼容。而且可供使用的库太多了,以至于经常有人会询问该使用哪一个。
  最后,在 Java 中使用可空性库是可选的。而 Kotlin 则要求每种类型都可以为空或不可为空。
  val nonNullable: String = computeNonNullableString()
  val nullable: String? = computeNullableString()

  扩展函数 (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 的特殊声明来实现它。
  例如,开发者可以为无法修改的第三方库中的类或接口编写新函数。这些函数可以以常见的方式进行调用,就好像它们是原始类的方法一样。这种机制称为扩展函数。
  具体化的泛型 (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,只有在必要的时候才会使用。

TAG: 软件开发 Java

 

评分:0

我来说两句

Open Toolbar