網(wǎng)站首頁 編程語言 正文
參考
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ù)是用于初始化對象的特殊方法。在創(chuàng)建類的對象時(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ī)則
也就是說;
與它的類名一樣命名它! !
好的,我們知道了! 但是…
我們具體有哪些類型的構(gòu)造函數(shù)類型?
缺省構(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)寫入你的邏輯 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ù),但是它的好處是什么呢?
讓我們來看一個(gè)例子!
class Print { static void log(String message) => print(message); } Print.log('ehe'); // 你想寫一個(gè)像這樣的util,但有一個(gè)問題,因?yàn)槟阋部梢詣?chuàng)建一個(gè)我們不想要的實(shí)例。 Print(); // 在這種情況下,這是絕對不必要的 // 如何防止這種情況?答案是私有構(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)建不同類型的實(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)建單例對象!
class User { User._privateConstructor(); static final User instance = User._privateConstructor(); }
注意
你可以在一些項(xiàng)目中看到 _internal
內(nèi)部關(guān)鍵字。沒什么特別的。_internal construction 只是一個(gè) ._internal 通常給類私有的構(gòu)造函數(shù)的名稱(不需要這個(gè)名稱)??梢允褂萌魏?Class._someName 結(jié)構(gòu)創(chuàng)建一個(gè)私有構(gòu)造函數(shù))。
Const Constructor ー const Class()
您可以使用 const constructor!
構(gòu)造函數(shù)使類變?yōu)椴豢勺兊模?/p>
常量構(gòu)造函數(shù)是一種優(yōu)化!編譯器使對象成為不可變的,為所有 Text('Hi!')
對象。ー Frank Treacy
const user = User('ehe'); class User { final String name; const User(this.name); }
工廠構(gòu)造函數(shù)ー factory class Class()
我們說過施工人員不允許回來,你猜怎么著?
工廠建造者可以!
工廠建造者還能做什么?
您根本不需要創(chuàng)建一個(gè)新實(shí)例!您可以調(diào)用另一個(gè)構(gòu)造函數(shù)或子類,甚至可以從緩存返回一個(gè)實(shí)例!
最后,對工廠的小小警告!
無法調(diào)用超類構(gòu)造函數(shù) (super()
)
簡單的例子
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; }
原文鏈接:https://blog.csdn.net/weixin_42320543/article/details/124421468
相關(guān)推薦
- 2022-08-26 Python?Decorator裝飾器的創(chuàng)建方法及常用場景分析_python
- 2022-03-14 flutter 列表左右滑動帶出按鈕選項(xiàng)
- 2022-07-21 提高新手寫代碼效率的Emmet插件怎么使用
- 2023-10-17 將一維數(shù)組截取成二維數(shù)組,要求二維數(shù)組中的每個(gè)數(shù)組length是一樣的才可以
- 2023-04-27 antd?upload上傳如何獲取文件寬高_(dá)React
- 2022-02-04 防止點(diǎn)擊量頁面刷新增加的簡單處理方法
- 2023-04-18 Android?懸浮按鈕之實(shí)現(xiàn)兔兔按鈕示例_Android
- 2022-04-21 Linux運(yùn)行級別介紹和root忘記密碼找回方法
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支