給Java開發(fā)者的Dart教程(20分鐘上手)


理解翻譯自: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中蒸甜。

在DartPad中打開bicycle類

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)的一樣压恒。

在DartPad中打開 Rectangle 示例

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);

}

在DartPad中的Shapes實(shí)例

你可以在控制臺看到打印結(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)槊總€類都隱式地定義了一個接口厉碟。

在DartPad中打開Shapes示例

?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)入坑了



最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末款咖,一起剝皮案震驚了整個濱河市何暮,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌铐殃,老刑警劉巖海洼,帶你破解...
    沈念sama閱讀 212,029評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異富腊,居然都是意外死亡坏逢,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,395評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來是整,“玉大人肖揣,你說我怎么就攤上這事「∪耄” “怎么了龙优?”我有些...
    開封第一講書人閱讀 157,570評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長舵盈。 經(jīng)常有香客問我,道長球化,這世上最難降的妖魔是什么秽晚? 我笑而不...
    開封第一講書人閱讀 56,535評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮筒愚,結(jié)果婚禮上赴蝇,老公的妹妹穿的比我還像新娘。我一直安慰自己巢掺,他們只是感情好句伶,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,650評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著陆淀,像睡著了一般考余。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上轧苫,一...
    開封第一講書人閱讀 49,850評論 1 290
  • 那天楚堤,我揣著相機(jī)與錄音,去河邊找鬼含懊。 笑死身冬,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的岔乔。 我是一名探鬼主播酥筝,決...
    沈念sama閱讀 39,006評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼雏门!你這毒婦竟也來了嘿歌?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,747評論 0 268
  • 序言:老撾萬榮一對情侶失蹤茁影,失蹤者是張志新(化名)和其女友劉穎搅幅,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體呼胚,經(jīng)...
    沈念sama閱讀 44,207評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡茄唐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,536評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片沪编。...
    茶點(diǎn)故事閱讀 38,683評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡呼盆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蚁廓,到底是詐尸還是另有隱情访圃,我是刑警寧澤,帶...
    沈念sama閱讀 34,342評論 4 330
  • 正文 年R本政府宣布相嵌,位于F島的核電站腿时,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏饭宾。R本人自食惡果不足惜批糟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,964評論 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望看铆。 院中可真熱鬧徽鼎,春花似錦、人聲如沸弹惦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,772評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽棠隐。三九已至石抡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間助泽,已是汗流浹背汁雷。 一陣腳步聲響...
    開封第一講書人閱讀 32,004評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留报咳,地道東北人侠讯。 一個月前我還...
    沈念sama閱讀 46,401評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像暑刃,于是被迫代替她去往敵國和親厢漩。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,566評論 2 349

推薦閱讀更多精彩內(nèi)容

  • 2014年的蘋果全球開發(fā)者大會(WWDC)岩臣,當(dāng)Craig Federighi向全世界宣布“We have new ...
    yeshenlong520閱讀 2,275評論 0 9
  • C#(C-Sharp)是Microsoft的新編程語言溜嗜,被譽(yù)為“C/C++家族中第一種面向組件的語言”。然而架谎,不管...
    浮生歲月閱讀 3,733評論 0 7
  • 上課前的準(zhǔn)備清單: 1.教室準(zhǔn)備:桌椅擺放符合授課要求炸宵,無安全隱患;白板,白板筆等; 2.教學(xué)用具準(zhǔn)備:電腦谷扣,每個...
    郭海霞閱讀 706評論 0 0
  • 1.輪播的實(shí)現(xiàn)原理是怎樣的土全?如果讓你來實(shí)現(xiàn)捎琐,你會抽象出哪些函數(shù)(or接口)供使用?(比如 play()) 示意圖 ...
    24_Magic閱讀 274評論 0 0
  • 今天休班裹匙,早上送孩子坐校車后瑞凑,發(fā)信息給皮老師說了孩子今天都帶了哪些東西去了,讓老師看看兒子會怎么跟老師說概页,兒子平時...
    郭家誠媽媽閱讀 322評論 0 0