Prerequisite
由於平常主要寫的程式語言是 Java
,因此自然而然會以 Java
的角度去比較與 Dart
有什麼不同。
這邊會記錄一些目前學到或用到,然後覺得可以稍微筆記一下的小差異。
DartPad 這是一個線上 IDE,可以直接在上面輸入 Dart
語法打程式。
這篇主要紀錄四個差異:
- 物件產生
- 建構子
- private
- final vs const
Dart 語法特性
1. 物件產生
在 Java
中,我們的 class 可能會長這樣:
class Person {
String name;
Integer age;
Person(String name, Integer age) {
this.name = name;
this.age = age;
}
}
這說明我們 Person 的類別有兩個參數,一個是 name
,另一個是 age
。
當我們要產生 Person 物件時,我們的寫法會長這樣:
Person person = new Person("Jake", 25);
但在 Dart
語言中,我們的寫法可以簡化為:
class Person {
String name; // 因為 Dart 不是強型別,所以也可以改成 var name; var age;
int age;
Person(this.name, this.age);
}
產生物件的話我們則可以寫成:
Person('Jake', 25); // 字串部分,單引號雙引號都可以,跟 Javascript 雷同
有沒有看到 Dart
的語法更簡潔,但也是非常清楚的。
2. 建構子
在建構子的部分,再進一步分享一下我覺得 Dart
超棒的地方,讓我們來看一下下方程式:
Person({this.name, this.age});
有沒有看到多了一個大括號,有了這個大括號我們就不用像 Java
一樣,每次產生物件時,都要照順序將我們的參數方進去囉!
這時我們可以有三個產生物件的發法:
Person(); // 第一種,沒傳入參數的
Person(age: 25); // 第二種,只傳入 age 參數
Person(name: 'Jake'); // 第三種,只傳入 name 參數
Person(age: 25, name: 'Jake'); // 第四種,傳入兩個參數
相信大家都有發現,很不一樣的是我在傳入參數時,多給了他的參數名,也就是加了
name:
和age:
這個動作。當我們加上大括號 {} 以後,有兩個地方需要注意:
- 這個大括號裡面的參數是可以不照順序的,所以如果參數很多的話我們就不需要記住每一個參數,特別是參數的型別如果都一樣,可以減少一些錯誤的機會。
- 在括號裡面的參數不是強制要求,所以如果我們想要讓
name
, 跟age
都是一定要傳入的參數的話,我們要寫成
Person({@required this.name, @required this.age});
其中
@required
這寫法是用到另外的Library
,但因為我是在學習Flutter
,所以使用這個寫法是沒問題的
3. Private
在 Java
,如果我們想要讓某個變數
,或 Function
變成 private 的,我們就會在前面加上 private:
private String name;
private void yourFunction(String name) {
... // do somthing
}
加上 private 後,我們的 name
跟 yourFunction
只能在自己產生的 instance 裡面使用。
在這邊,Dart
有非常類似的做法:
String _name;
void _yourFunction(String name) {
... // do somthing
}
我們只需要在變數
跟 Function
名稱前面加一個 _
,就可以做到一樣的事情了!
4. final vs const
final
跟 const
都是特殊的保留字,當參數前面有這兩字的任一個時,代表這個參數是不能被改變的。
舉個例子,如果在程式中看到
final String name = 'Jake';
name = 'Tom'; // 這行會錯,因為我們已經在 name 前面給了 final 的關鍵字了
好了,那這兩個到底差在哪呢?
- final: 差異在我們可以在 rumtime 階段,才給有 final 保留字的參數值,但是在給定以後,就不能更改。
- const: 在 compile 階段就需要給定參數了,給定後就不能更改。