理解翻譯自:https://codelabs.developers.google.com/codelabs/from-java-to-dart/#0
? ? ? ? ? ? ? ? ? ? ?https://github.com/dart-lang/dart-pad
一、簡介
Dart是谷歌開發(fā)的計算機(jī)編程語言序仙,后來被Ecma (ECMA-408)認(rèn)定為標(biāo)準(zhǔn)筷黔。它被用于web、服務(wù)器黍少、移動應(yīng)用和物聯(lián)網(wǎng)等領(lǐng)域的開發(fā)(From自百度百科)。
開發(fā)工具也十分多樣,例如?IntelliJ 瓢捉、 WebStorm笨忌、Android Studio等蓝仲。當(dāng)然任性的你也可以什么都不裝(就裝逼),因?yàn)間oogle官方為你提供了在線的Dart編譯環(huán)境?DartPad官疲。
直入主題:
二袱结、創(chuàng)建簡單的Dart類。
以下為一個帶有三個屬性的Bicycle類途凫,和main函數(shù)垢夹。
class Bicycle {
int cadence;
int speed;
int gear;
}
void main() {
}
* main()方法作為Dart的入口方法,這點(diǎn)大家都能快速理解维费。
* Dart中不會申明?public,?private, or?protected關(guān)鍵字果元,不論是類促王、方法、變量上而晒。且默認(rèn)都是public蝇狼。如果標(biāo)識符前面加“_”,就是私有變量或者函數(shù)(下面會講到)倡怎。
1.定義構(gòu)造函數(shù)
· 添加以下構(gòu)造函數(shù)到Bicycle類中去
Bicycle(this.cadence, this.speed, this.gear);
* 使用該構(gòu)造方法能夠快速地實(shí)現(xiàn)變量的賦值迅耘,等同于下面的構(gòu)造方法。
* Dart中無方法體的構(gòu)造方法是合法的监署。
Bicycle(int cadence, int speed, int gear) {
this.cadence = cadence;
this.speed = speed;
this.gear = gear;
}
· 實(shí)例化Bicycle并打印
在main()函數(shù)中添加如下代碼:
void main() {
var bike = new Bicycle(2, 0, 1);
print(bike);
}
* 如果已知變量不會再改變豹障,可以使用final來代替var。
* 在Dart2中?'new' 為可選關(guān)鍵字焦匈,你也可以寫成? bike =?Bicycle(2, 0, 1)血公。
運(yùn)行以上栗子??后,你會看到以下的輸出結(jié)果:
Instance of 'Bicycle'
如此缓熟,便可以看出 var bike = ... 定義了Bicycle的實(shí)例累魔。
2.增強(qiáng)輸出顯示
如上" Instance of ‘Bicycle' "輸出結(jié)果,難以看出類的結(jié)構(gòu)來够滑。所有的Dart類同Java一樣提供了重寫toString()的方式垦写,來增強(qiáng)類的輸出。
=>在Bicycle類中添加toString()方法:
@overrideString toString() => 'Bicycle: $speed mph';
*?@override 注解等同于Java中的
* Dart中可以用單引號或雙引號創(chuàng)建字符串彰触,可以同時使用(栗子:雙引號中包含單引號)梯投。
*? 使用${expression}在字符串中插入表達(dá)式,如果是標(biāo)識符况毅,可以省略{ }分蓖,?以上'Bicycle: $speed mph'等同于?'Bicycle: ${speed} mph'。
* 使用 =>來代替return的寫法尔许,實(shí)現(xiàn)單行縮進(jìn)效果么鹤,代碼簡潔有效。等效于下面的代碼:
@overrideString toString() {
return 'Bicycle: $speed mph';
}
輸出結(jié)果:
Bicycle: 0 mph
3.添加只讀變量
通常在Java中定義speed為只讀變量 ——會將它申明為private并僅提供一個getter方法味廊。接下來我們將實(shí)現(xiàn)相同的功能在Dart中蒸甜。
Dart中定義私有標(biāo)識,是讓變量名以下劃線 (_) 開頭余佛。在通過修改speed名字和添加getter方法柠新,使其成為只讀變量。
· 創(chuàng)建私有的speed變量:
* 在Bicycle構(gòu)造函數(shù)中辉巡,移除speed參數(shù):
Bicycle(this.cadence, this.gear);
* 在main()函數(shù)中恨憎,移除第二傳參(speed):
var bike = Bicycle(2, 1);
* 將原speed變量改為_speed,初始化_speed
int _speed = 0;
* 添加getter方法在Bicycle類中:
int get speed => _speed;
* 未初始化變量(包括numbers類型) 默認(rèn)值都是null红氯。
* Dart編譯器會設(shè)置 以下劃線開頭的標(biāo)識符為私有框咙。
* 默認(rèn)下,Dart為所有的public實(shí)例變量提供了getters 和 setters 痢甘。不需要定義getters 和 setters就可以隨處使用變量喇嘱,更新變量。除非你想指定變量的只讀或者只寫塞栅,才需要重新定義getters 和 setters者铜。
· 添加以下方法到Bicycle類中:
void applyBrake(int decrement) {
_speed -= decrement;
}
void speedUp(int increment) {
_speed += increment;
}
· 最后的栗子??看起來于Java類似,但代碼僅23行相對于Java的40顯得相當(dāng)精簡放椰。
class Bicycle {
int cadence;
int _speed = 0;
int gear;
Bicycle(this.cadence, this.gear);
void applyBrake(int decrement) {
_speed -= decrement;
}
void speedUp(int increment) {
_speed += increment;
}
@override String toString() => 'Bicycle: $_speed mph';
}
void main() {
var bike = new Bicycle(2, 1);
print(bike);
}
三作烟、使用可選參數(shù)(替代重載)
接下去練習(xí)定義一個?Rectangle class, Java教程的一個示例。
Java中構(gòu)造方法可通過重載砾医,實(shí)現(xiàn)不同參數(shù)數(shù)量或類型的方法定義拿撩。而Dart中不支持重載構(gòu)造函數(shù),處理這種狀態(tài)如蚜,正如本節(jié)中你會發(fā)現(xiàn)的一樣压恒。
1.添加Rectangle構(gòu)造方法
Dart中一個空構(gòu)造方法來實(shí)現(xiàn)Java四個重載構(gòu)造方法。
Rectangle({this.origin = const Point(0, 0), this.width = 0, this.height = 0});
該構(gòu)造使用了可選命名參數(shù)错邦。
* this.origin探赫、this.width、 this.height?使用簡寫技巧在構(gòu)造函數(shù)的聲明中為實(shí)例變量賦初始值撬呢。
* this.origin伦吠、this.width、 this.height 都是可選命名參數(shù)魂拦。命名參數(shù)都閉包于大括號中 ({})毛仪。
* 其中 this.origin = const Point(0, 0)為origin實(shí)例變量指定了默認(rèn)值——Point(0,0)。指定的默認(rèn)值必須是編譯時常量芯勘。 該構(gòu)造函數(shù)為三個實(shí)例變量都提供默認(rèn)值潭千。
2.增強(qiáng)輸出
· 添加toString()方法,到Rectangle類中:
@overrideString toString() => 'Origin: (${origin.x}, ${origin.y}), width: $width, height: $height';
3.使用構(gòu)造方法
根據(jù)你需要的參數(shù)借尿,在main()方法中去驗(yàn)證Rectangle實(shí)例刨晴。
main() {
print(new Rectangle(origin: const Point(10, 20), width: 100, height: 200));
print(new Rectangle(origin: const Point(10, 10)));
print(new Rectangle(width: 200)); print(new Rectangle());
}
如上Dart使用單行的構(gòu)造函數(shù),實(shí)現(xiàn)了Java16行代碼的等效功能路翻。
4.運(yùn)行實(shí)例
你會看到如下的輸出:
Origin: (10, 20), width: 100, height: 200
Origin: (10, 10), width: 0, height: 0
Origin: (0, 0), width: 200, height: 0
Origin: (0, 0), width: 0, height: 0
四狈癞、創(chuàng)建一個工廠
工廠模式作為Java中常見的一種設(shè)計模式,相比直接實(shí)例化對象存在幾個優(yōu)勢茂契。例如:隱藏實(shí)例的細(xì)節(jié)蝶桶、能夠提供工廠返回類型的子類型,并且可選地返回現(xiàn)有對象而不是新對象掉冶。
這里演示兩種實(shí)現(xiàn)創(chuàng)建shape-creation工廠的方法:
* 方式1:創(chuàng)建一個頂級函數(shù)
* 方式2:創(chuàng)建一個工廠構(gòu)造方法
在本練習(xí)中真竖,將使用Shapes示例脐雪,該示例將實(shí)例化形狀并打印其計算區(qū)域:
import 'dart:math';
abstract class Shape {
num get area;
}
class Circle implements Shape {
final num radius; Circle(this.radius);
num get area => PI * pow(radius, 2);
}
class Square implements Shape {
final num side; Square(this.side);
num get area => pow(side, 2);
}
main() {
final circle = new Circle(2);
final square = new Square(2);
print(circle.area); print(square.area);
}
你可以在控制臺看到打印結(jié)果:
12.566370614359172
4
觀察結(jié)論:
* Dart 支持抽象( abstract)類 classes。
* 在一個文件中可定義多個類恢共。
* dart.math是Dart's 的核心庫之一战秋。其他核心庫還包括: dart:core, dart:async, dart:convert, and dart:collection。
* 以上代碼包括兩個getters方法計算面積值:
num get area => PI * pow(radius, 2); // Circle
num get area => pow(side, 2); // Square
* 方式1:創(chuàng)建一個頂級函數(shù)
?Implement a factory as a top-level function by adding the following function at the highest level (outside of any class):
通過在頂層添加以下方法(類的外層)讨韭,來實(shí)現(xiàn)一個工廠作為頂層方法脂信。
Shape shapeFactory(String type) {
if (type == 'circle') return new Circle(2);
if (type == 'square') return new Square(2);
throw 'Can\'t create $type.';
}
在main()函數(shù)中調(diào)調(diào)用工廠方法:
final circle = shapeFactory('circle');
final square = shapeFactory('square');
運(yùn)行實(shí)例
輸出結(jié)果與之前相同。
觀察結(jié)論:
* 如果函數(shù)調(diào)用傳入?'circle' 或 'square'外的參數(shù)透硝,將拋出異常狰闪。
*??Dart SDK中已有定義多個通用的異常類,或者你也可以繼承這些異常類來創(chuàng)建一個你指定的異常濒生。在本例中你也可以拋出一個描述異常原因的字符串埋泵。
* 對于DartPad中未捕獲的異常∽镏危可以通過try-catch語句包裹秋泄,并打印異常來觀察」娣В可選練習(xí)?DartPad example.
* 在單引號字符串中使用單引號需要加上(\)來轉(zhuǎn)義 ('Can\'t create $type.') 或者使用雙引號嵌套 ("Can't create $type.")恒序。
* 方式2:創(chuàng)建一個工廠構(gòu)造方法
使用Dart的factory關(guān)鍵字來創(chuàng)建工廠構(gòu)造方法
*?在Shape抽象類中添加工廠的構(gòu)造方法:
abstract class Shape {
factory Shape(String type) {
if (type == 'circle') return new Circle(2);
if (type == 'square') return new Square(2);
throw 'Can\'t create $type.';
}
num get area;
}
main()函數(shù)中改為:
final circle = new Shape('circle');
final square = new Shape('square');
刪除之前添加的shapeFactory()方法。
觀察結(jié)論:
* 工廠(factory)構(gòu)造方法實(shí)現(xiàn)了shapeFactory()相同的功能谁撼。
五歧胁、實(shí)現(xiàn)一個接口
Dart語言不包含interface關(guān)鍵字,因?yàn)槊總€類都隱式地定義了一個接口厉碟。
?Add a CircleMock class that extends the Circle class:
加入一個CircleMock類喊巍,并繼承Circle類:
class CircleMock implements Circle {}
這時候你應(yīng)該會看到?"Missing concrete implementations" 錯誤。在類中定義area和radius來修復(fù)這個錯誤吧箍鼓。
class CircleMock implements Circle {
num area;
num radius;
}
六崭参、在Dart上函數(shù)式編程
七、恭喜你
你可能已經(jīng)入坑了