Android開發Dart Constructors構造函數使用技巧整理
參考
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 構造函數的一些使用技巧
首先
什麼是構造函數?
構造函數是用於初始化對象的特殊方法。在創建類的對象時調用構造函數。
默認情況
final ehe = MyClass(); // Creates an instanceclass MyClass { MyClass(); // Fires immediately when created (this guy is cons.) }
在構造函數中隻有一個規則
也就是說;
與它的類名一樣命名它! !
好的,我們知道瞭! 但是…
我們具體有哪些類型的構造函數類型?
缺省構造函數 ー Class()
// Default Constructor // 默認什麼都不做 class User { String name = 'ehe'; User(); } /// // Constructor with parameters // 構造時初始變量 class User { String name; User(this.name); } /// // Constructor with the initial method // 構造函數內寫入你的邏輯 class User { String name; User(this.name) { // do some magic } } / // Constructor with assertion // 使用 Asserts 去檢查你的規則 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() // 命名構造函數 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); }
私有構造函數ー Class._()
您可以使用 _
創建私有構造函數,但是它的好處是什麼呢?
讓我們來看一個例子!
class Print { static void log(String message) => print(message); } Print.log('ehe'); // 你想寫一個像這樣的util,但有一個問題,因為你也可以創建一個我們不想要的實例。 Print(); // 在這種情況下,這是絕對不必要的 // 如何防止這種情況?答案是私有構造函數! class Print { Print._(); // 這將阻止創建實例 static void log(String message) => print(message); } Print(); // 這將給出現在的編譯時錯誤 Your instance is safe now!
所以基本上你可以阻止創建一個實例!
命名構造函數ー class.Named()
您可以在一個 class
中創建不同類型的實例
For example;
例如:
class User { String name; int salary; User.worker(this.name) : salary = 10; User.boss(this.name) : salary = 99999999; }
私有命名構造函數ー class._Named ()
您可以很容易地清洗您的實例!
class User { String name; int salary; User.worker(this.name) : salary = 10; User.boss(this.name) : salary = 99999999; User._mafia(this.name) : salary = 9999999999999; }
除瞭玩笑之外,這是非常有幫助的!
例如,您可以使用私有構造函數創建單例對象!
class User { User._privateConstructor(); static final User instance = User._privateConstructor(); }
註意
你可以在一些項目中看到 _internal
內部關鍵字。沒什麼特別的。_internal construction 隻是一個 ._internal 通常給類私有的構造函數的名稱(不需要這個名稱)。可以使用任何 Class._someName 結構創建一個私有構造函數)。
Const Constructor ー const Class()
您可以使用 const constructor!
構造函數使類變為不可變的!
常量構造函數是一種優化!編譯器使對象成為不可變的,為所有 Text('Hi!')
對象。ー Frank Treacy
const user = User('ehe'); class User { final String name; const User(this.name); }
工廠構造函數ー factory class Class()
我們說過施工人員不允許回來,你猜怎麼著?
工廠建造者可以!
工廠建造者還能做什麼?
您根本不需要創建一個新實例!您可以調用另一個構造函數或子類,甚至可以從緩存返回一個實例!
最後,對工廠的小小警告!
無法調用超類構造函數 (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; }
以上就是Android開發Dart Constructors構造函數使用技巧整理的詳細內容,更多關於Dart Constructors構造函數的資料請關註WalkonNet其它相關文章!