Kotlin比Java更年輕,但它是一個非常有前途的程式設計語言,它的社區不斷增長。 每個人都在談論它,並說它很酷。 但為什麼這麼特別。
我們準備了一系列文章,分享我們在Kotlin開發Android應用程式的經驗。 我們將討論Kotlin與Java在文法,可用性,UI效能和非同步性方面的區別,以便您可以決定哪種語言最適合您。
讓我們從一些基本的文法差異開始。 這是第一個:
1. 使用Kotlin,你可以用更少的代碼做更多
Kotlin的一個主要優點是它的簡潔。 你用更少的代碼獲得更多的功能。 而你寫的代碼越少,你犯的錯誤就越少。 這很簡單。 讓我們看看Kotlin的基礎知識,從類開始。
public final class Person { private String name; private int age; private float height; public Person(String name, int age, float height) { this.name = name; this.age = age; this.height = height; } public Person(String name, int age) { this.name = name; this.age = age; this.height = 1.8f; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public float getHeight() { return height; } public void setHeight(float height) { this.height = height; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + ", height=" + height + '}'; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Person person = (Person) o; if (age != person.age) return false; if (Float.compare(person.height, height) != 0) return false; return name != null ? name.equals(person.name) : person.name == null } @Override public int hashCode() { int result = name != null ? name.hashCode() : 0; result = 31 * result + age; result = 31 * result + (height != +0.0f ? Float.floatToIntBits(height) : 0); return result; } }
上面是一個通常的Java類。 它做的不多。 它只包含一些資料。 但是,當你意識到它給錶帶來的不足時,看看這段代碼有多大是很痛苦的。 為了鼓勵你,我們會給你一個等同的類寫在Kotlin。
data class Person(var name: String, var age: Int, var height: Float = 1.8f)
是的,你會為你的資料類自動擷取需要的getters,setters,equals(),hashcode(),toString()和copy()函數。 當然,你可以輕鬆地重寫這些函數,但在大多數情況下,只需聲明類及其屬性就足夠了。
這正是我們的意思,當我們說Kotlin簡潔。
2. 你可以避免 NullPointerException
現在我們想提醒你在許多程式設計語言中最大的痛苦 - null 指標異常。 我們幾乎不能想象自從托尼·霍爾在1965年發明它之後,有多少開發人員遭受了null 指標,同時試圖使事情更簡單一些。
可悲的是,我們不能及時回來,防止Tony犯這個錯誤。 但是使用Kotlin,我們現在可以輕鬆地轉義NullPointerException。
val person: Person? = null...person?.name = "John"
如果變數是可空的,編譯器將不允許你訪問它沒有適當的檢查。 Kotlin強迫你使用。 運算子。 這可以防止應用程式自動崩潰。
它如何在引擎蓋下工作。 讓我們回顧一下產生的位元組碼。
L2LINENUMBER 18 L2ALOAD 3DUPIFNULL L3LDC "John"INVOKEVIRTUAL igalata/com/kotlinexample/Person.setName (Ljava/lang/String;)VGOTO L4L3POP
正如你所看到的,我們在這裡有相同的空檢查。 JetBrains的開發人員(建立Kotlin)知道每次檢查我們的變數是避免NullPointerException的唯一方法。 但他們也知道Android開發人員不想在他們的項目中處理NullPointerException。 他們可能想:“為什麼不自動產生這個檢查如果變數是可空的。
JetBrains的開發人員只是這樣,讓我們的生活更容易了。
3. 你可以擺脫util類
讓我們來討論一下有關使用util類的醜陋事情。 你有沒有一個項目沒有他們。 我們幾乎不記得這一切。 Kotlin有一個聰明的解決方案 - 擴充功能 - 協助你擺脫所有的util類一勞永逸。
擴充函數幾乎是一個通常的Kotlin函數。 但是當你聲明它,你需要指定的執行個體將具有擴充功能的類。
fun Context.toast(text: String) = Toast.makeText(this, text, Toast.LENGTH_SHORT).show()
注意'this',我們作為參數傳遞給makeText()方法。 它不是類的一個執行個體,我們聲明這個函數,而是一個Context執行個體。 現在你可以直接從你的Activity或任何其他Context執行個體調用這個函數。 例如:
toast("Hi")
你應該記住,擴充函數不以任何方式修改它擴充的類。 那麼它如何工作而不改變原來的類。 讓我們再次看到位元組碼。
public final toast(Landroid/content/Context;Ljava/lang/String;)V @Lorg/jetbrains/annotations/NotNull;()