Android開(kāi)發(fā)Dart?Constructors構(gòu)造函數(shù)使用技巧整理
參考
https://dart.dev/guides/language/language-tour#factory-constructors
https://www.freecodecamp.org/news/constructors-in-dart
https://stackoverflow.com/questions/52299304/dart-advantage-of-a-factory-constructor-identifier
https://dash-overflow.net/articles/factory/
https://flutterigniter.com/deconstructing-dart-constructors/
https://dart.dev/guides/language/language-tour
正文
這篇文章是探討下 Dart 構(gòu)造函數(shù)的一些使用技巧
首先
什么是構(gòu)造函數(shù)?
構(gòu)造函數(shù)是用于初始化對(duì)象的特殊方法。在創(chuàng)建類(lèi)的對(duì)象時(shí)調(diào)用構(gòu)造函數(shù)。
默認(rèn)情況
final ehe = MyClass(); // Creates an instanceclass MyClass {
MyClass(); // Fires immediately when created (this guy is cons.)
}
在構(gòu)造函數(shù)中只有一個(gè)規(guī)則
也就是說(shuō);
與它的類(lèi)名一樣命名它! !
好的,我們知道了! 但是…
我們具體有哪些類(lèi)型的構(gòu)造函數(shù)類(lèi)型?
缺省構(gòu)造函數(shù) ー Class()
// Default Constructor
// 默認(rèn)什么都不做
class User {
String name = 'ehe';
User();
}
///
// Constructor with parameters
// 構(gòu)造時(shí)初始變量
class User {
String name;
User(this.name);
}
///
// Constructor with the initial method
// 構(gòu)造函數(shù)內(nèi)寫(xiě)入你的邏輯
class User {
String name;
User(this.name) {
// do some magic
}
}
/
// Constructor with assertion
// 使用 Asserts 去檢查你的規(guī)則
class User {
String name;
User(this.name) : assert(name.length > 3);
}
// Constructor with initializer
// 初始化你的變量
class User {
static String uppercase(String e) => e.toUpperCase();
String name;
User(name) : name = yell(name);
static String yell(String e) => e.toUpperCase();
}
/
// Constructor with super()
// override 變量
class Person {
String id;
Person(this.id);
}
class User extends Person {
String name;
User(this.name, String id) : super(id);
}
/
// Constructor with this()
// 命名構(gòu)造函數(shù)
class User {
String name;
int salary;
User(this.name, this.salary);
User.worker(String name) : this(name, 10);
User.boss(String name) : this(name, 9999999);
}
私有構(gòu)造函數(shù)ー Class._()
您可以使用 _ 創(chuàng)建私有構(gòu)造函數(shù),但是它的好處是什么呢?
讓我們來(lái)看一個(gè)例子!
class Print {
static void log(String message) => print(message);
}
Print.log('ehe');
// 你想寫(xiě)一個(gè)像這樣的util,但有一個(gè)問(wèn)題,因?yàn)槟阋部梢詣?chuàng)建一個(gè)我們不想要的實(shí)例。
Print(); // 在這種情況下,這是絕對(duì)不必要的
// 如何防止這種情況?答案是私有構(gòu)造函數(shù)!
class Print {
Print._(); // 這將阻止創(chuàng)建實(shí)例
static void log(String message) => print(message);
}
Print(); // 這將給出現(xiàn)在的編譯時(shí)錯(cuò)誤
Your instance is safe now!
所以基本上你可以阻止創(chuàng)建一個(gè)實(shí)例!
命名構(gòu)造函數(shù)ー class.Named()
您可以在一個(gè) class 中創(chuàng)建不同類(lèi)型的實(shí)例
For example;
例如:
class User {
String name;
int salary;
User.worker(this.name) : salary = 10;
User.boss(this.name) : salary = 99999999;
}
私有命名構(gòu)造函數(shù)ー class._Named ()
您可以很容易地清洗您的實(shí)例!
class User {
String name;
int salary;
User.worker(this.name) : salary = 10;
User.boss(this.name) : salary = 99999999;
User._mafia(this.name) : salary = 9999999999999;
}
除了玩笑之外,這是非常有幫助的!
例如,您可以使用私有構(gòu)造函數(shù)創(chuàng)建單例對(duì)象!
class User {
User._privateConstructor();
static final User instance = User._privateConstructor();
}
注意
你可以在一些項(xiàng)目中看到 _internal 內(nèi)部關(guān)鍵字。沒(méi)什么特別的。_internal construction 只是一個(gè) ._internal 通常給類(lèi)私有的構(gòu)造函數(shù)的名稱(chēng)(不需要這個(gè)名稱(chēng))??梢允褂萌魏?Class._someName 結(jié)構(gòu)創(chuàng)建一個(gè)私有構(gòu)造函數(shù))。
Const Constructor ー const Class()
您可以使用 const constructor! 構(gòu)造函數(shù)使類(lèi)變?yōu)椴豢勺兊模?/p>
常量構(gòu)造函數(shù)是一種優(yōu)化!編譯器使對(duì)象成為不可變的,為所有 Text('Hi!') 對(duì)象。ー Frank Treacy
const user = User('ehe');
class User {
final String name;
const User(this.name);
}
工廠構(gòu)造函數(shù)ー factory class Class()
我們說(shuō)過(guò)施工人員不允許回來(lái),你猜怎么著?
工廠建造者可以!
工廠建造者還能做什么?
您根本不需要?jiǎng)?chuàng)建一個(gè)新實(shí)例!您可以調(diào)用另一個(gè)構(gòu)造函數(shù)或子類(lèi),甚至可以從緩存返回一個(gè)實(shí)例!
最后,對(duì)工廠的小小警告!
無(wú)法調(diào)用超類(lèi)構(gòu)造函數(shù) (super())
簡(jiǎn)單的例子
class User {
final String name;
User(this.name);
factory User.fromJson(Map<String, dynamic> json) {
return User(json["name"]);
}
}
// Singleton Example
class User {
User._internal();
static final User _singleton = Singleton._internal();
factory User() => _singleton;
}
以上就是Android開(kāi)發(fā)Dart Constructors構(gòu)造函數(shù)使用技巧整理的詳細(xì)內(nèi)容,更多關(guān)于Dart Constructors構(gòu)造函數(shù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Kotlin語(yǔ)言使用BroadcastReceiver示例介紹
Android開(kāi)發(fā)的四大組件分別是:活動(dòng)(activity),用于表現(xiàn)功能;服務(wù)(service),后臺(tái)運(yùn)行服務(wù),不提供界面呈現(xiàn);廣播接受者(Broadcast Receive),勇于接收廣播;內(nèi)容提供者(Content Provider),支持多個(gè)應(yīng)用中存儲(chǔ)和讀取數(shù)據(jù),相當(dāng)于數(shù)據(jù)庫(kù),本篇著重介紹廣播組件2022-09-09
Jetpack Compose之選擇器使用實(shí)例講解
這篇文章主要介紹了Jetpack Compose之選擇器使用,選擇器主要是指Checkbox復(fù)選框,單選開(kāi)關(guān)Switch,滑桿組件Slider等用于提供給用戶(hù)選擇一些值和程序交互的組件,比如像復(fù)選框Checkbox,可以讓用戶(hù)選擇一個(gè)或者多個(gè)選項(xiàng)2023-04-04
Android開(kāi)發(fā)實(shí)現(xiàn)ListView部分布局監(jiān)聽(tīng)的方法
這篇文章主要介紹了Android開(kāi)發(fā)實(shí)現(xiàn)ListView部分布局監(jiān)聽(tīng)的方法,結(jié)合實(shí)例形式分析了Android通過(guò)設(shè)置tag標(biāo)志位實(shí)現(xiàn)ListView部分布局監(jiān)聽(tīng)的相關(guān)操作技巧,需要的朋友可以參考下2018-01-01
Android 日期和時(shí)間的使用實(shí)例詳解
這篇文章主要介紹了Android 日期和時(shí)間的使用實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2016-12-12
Android實(shí)現(xiàn)二維碼掃描并登陸網(wǎng)頁(yè)
AlertDialog點(diǎn)擊按鈕不消失的實(shí)現(xiàn)方法
android從系統(tǒng)圖庫(kù)中取圖片的實(shí)例代碼
Android BottomNavigationBar底部導(dǎo)航的使用方法

