原文
https://itnext.io/deep-dive-i...
參考
- https://dart.dev/guides/langu...
- https://www.freecodecamp.org/...
- https://stackoverflow.com/que...
- https://dash-overflow.net/art...
- https://flutterigniter.com/de...
- https://dart.dev/guides/langu...
正文
這篇文章是探討下 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;
}
© 貓哥
- 微信 ducafecat
- 部落格 ducafecat.tech
- github
- bilibili