自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Kotlin 開發(fā)者眼中的 Java 缺少哪些特性?

開發(fā) 前端
資深程序員Nicolas Fr?nkel 以 “Kotlin 開發(fā)者” 身份總結(jié)了他認為 Java 缺少的特性。

Nicolas Fr?nkel 是一名資深程序員,擁有近二十年的 Java 開發(fā)經(jīng)歷。他在幾年前開始學(xué)習(xí) Kotlin,在此之后,每當他再使用 Java 時,總會思考為什么自己寫的 Java 代碼看起來不如 Kotlin 那么優(yōu)雅,并且發(fā)現(xiàn) Java 缺少一些可以提升代碼可讀性、表現(xiàn)力和可維護性的功能。

對此,Nicolas Fr?nkel 以 “Kotlin 開發(fā)者” 身份總結(jié)了他認為 Java 缺少的特性:

  • 不可變引用 (Immutable References)
  • 空安全 (Null Safety)
  • 擴展函數(shù) (Extension Function)
  • 具體化的泛型 (Reified Generics)

不可變引用 (Immutable References)

雖然 Java 允許開發(fā)者定義不可變引用,但這不是強制性的。因為默認情況下,引用是可變的。大多數(shù) Java 代碼沒有利用不可變引用。

Kotlin 不會讓開發(fā)者選擇:每個屬性和局部變量都需要定義為 aval? 或 a var。另外,Kotlin 不支持重新分配方法參數(shù)。

空安全 (Null Safety)

在 Java 中,無法知道變量是否為 null??;诖?,Java 8 引入了 Optional?類型。從 Java 8 開始,返回 Optional? 意味著基礎(chǔ)值可以是 null?; 返回另一種類型則意味著不是。但是,Optional 開發(fā)者僅將其設(shè)計為返回值。方法參數(shù)和返回值的語言語法中沒有可用的內(nèi)容。為了解決這個問題,許多庫提供了編譯時注釋。

顯然,有些庫專注于特定的 IDE。此外,庫之間幾乎不兼容。而且可供使用的庫太多了,以至于經(jīng)常有人會詢問該使用哪一個。

最后,在 Java 中使用可空性庫是可選的。而 Kotlin 則要求每種類型都可以為空或不可為空。

val nonNullable: String = computeNonNullableString()
val nullable: String? = computeNullableString()

擴展函數(shù) (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 的擴展函數(shù)特性重寫為:

fun String.capitalize2(): String {                            
return substring(0, 1).uppercase() + substring(1);
}

val string = randomString()
val capitalizedString = string.capitalize2()

Kotlin 提供了使用新功能擴展類或接口的能力,而無需從類繼承或使用 Decorator 等設(shè)計模式。開發(fā)者可以通過名為 extensions 的特殊聲明來實現(xiàn)它。

例如,開發(fā)者可以為無法修改的第三方庫中的類或接口編寫新函數(shù)。這些函數(shù)可以以常見的方式進行調(diào)用,就好像它們是原始類的方法一樣。這種機制稱為擴展函數(shù)。

具體化的泛型 (Reified Generics)

舉個例子,如何從值的容器中獲取類型化的值。下面是 Spring 的示例:

org/springframework/beans/factory/BeanFactory.java

public interface BeanFactory {
<T> T getBean(Class<T> requiredType);
}

開發(fā)者添加了一個 Class<T> 參數(shù),以便能夠知道方法體中的類型。但如果 Java 已經(jīng)具體化了泛型,那就可以這樣寫:

public interface BeanFactory {
<T> T getBean();
}

如果 Kotlin 已經(jīng)具體化了泛型:

interface BeanFactory {
fun <T> getBean(): T
}

并調(diào)用函數(shù):

val factory = getBeanFactory()
val anyBean = getBean<Any>()

Nicolas Fr?nkel 表示,Kotlin 已成為他在 JVM 上的首選編程語言,至于 Java,只有在必要的時候才會使用。

責任編輯:趙寧寧 來源: OSCHINA
相關(guān)推薦

2019-04-16 09:00:05

AndroidKotlinJava

2009-05-13 08:32:53

GoogleAndroid移動OS

2009-05-12 09:35:40

移動MoblinAndroid

2013-08-29 09:53:48

開發(fā)者iOS 7

2013-08-03 17:01:46

AndroidGenymotion

2013-07-17 09:08:15

2010-10-14 09:41:10

Windows Pho

2015-11-24 09:17:01

產(chǎn)品設(shè)計UI

2013-07-15 10:14:29

leap motion體感交互

2013-08-29 14:11:00

開發(fā)者AndroidiOS

2015-08-06 17:15:28

2013-03-28 10:31:59

開發(fā)者HTML5壟斷

2019-09-10 09:10:45

開發(fā)者技能Java

2014-06-06 09:56:02

開發(fā)者GUI測試工具

2012-06-13 01:23:30

開發(fā)者程序員

2015-07-06 10:31:50

Java開發(fā)者監(jiān)控工具

2011-03-15 14:26:28

Java

2017-05-19 16:40:41

AndroidKotlin開發(fā)者

2011-03-17 11:45:30

iPad 2應(yīng)用開發(fā)者

2014-07-17 09:31:50

iOS8SDK
點贊
收藏

51CTO技術(shù)棧公眾號