[英]static constructor in Dart
如何在 Dart 中編寫靜態構造函數?
class Generator
{
static List<Type> typesList = [];
//static
//{ /*static initializations*/}
}
Dart 中沒有靜態構造函數這樣的東西。 命名構造函數如Shape.circle()
是通過類似的東西實現的
class A {
A() {
print('default constructor');
}
A.named() {
print('named constructor');
}
}
void main() {
A();
A.named();
}
您可能還對這個工廠構造函數問題感興趣
更新:一些靜態初始值設定項的變通方法
class A {
static const List<Type> typesList = [];
A() {
if (typesList.isEmpty) {
// initialization...
}
}
}
或者,如果類的用戶不打算訪問靜態內容,則可以將其移出類。
const List<Type> _typesList = [];
void _initTypes() {}
class A {
A() {
if (_typesList.isEmpty) _initTypes();
}
}
您可以通過在構造函數中直接調用 class.member 來初始化靜態成員:
class A {
static int a;
static int b;
A(int a, int b) {
A.a ??= a; ///by using the null-equals operator, you ensure this can only be set once
A.b ??= b;
}
}
main(){
A(5,10);
A(2,4);
assert(A.a == 5);
assert(A.b == 10);
}
靈感來自@Mahmoud salah eldien saber 答案創建單例,以及對單例變量的靜態變量引用
void main() {
print('${Singleton.add()}');
print('${Singleton.add()}');
print('${Singleton.add()}');
print('${Singleton.add()}');
}
class Singleton {
Singleton();
//static
static List<int> typeList = Singleton.internal()._typeList;
static List<int> add() {
typeList.add(1);
return typeList;
}
List<int> _typeList = [];
factory Singleton.internal() {
var s = Singleton();
for(int i = 0 ; i < 5; i++ ) {
s._typeList.add(2);
}
return s;
}
}
我也想找到這個問題的官方答案。
靜態變量聲明被延遲初始化以避免在程序啟動時代價高昂的初始化(以及隨之而來的緩慢)。第一次讀取靜態變量 v 時,它被設置為評估其初始化程序的結果。
https://groups.google.com/a/dartlang.org/forum/#!topic/misc/dKurFjODRXQ
要創建靜態(構造函數或類),在 dart 中非常容易,只需在此類中創建靜態變量並為其提供來自同一類的對象:
class A {
static var instance = A();
static List<int> typesList = [];
A() {
print('Call constructor to create object');
}
List<int> add() {
typesList.add(1);
return typesList;
}
}
void main() {
print(A.instance.add());
print(A.instance.add());
print(A.instance.add());
print(A.instance.add());
}
初始化靜態變量的一種解決方法可能是使用“..”(稱為“級聯”)運算符。 此解決方法不需要對象實例。 有關級聯運算符的更多信息: https : //dart.dev/guides/language/language-tour#cascade-notation- 。
例子:
static List firstList = [ 'hello', 12, 'goodbye'];
static List dummyObjects = List()
..addAll(firstList)
..add('another String value')
..add('and one more')
..add(Object())
..removeWhere((o) => o is! String)
;
(因此dummyObjects
僅使用 String 類型的對象初始化,因為所有其他對象都被丟棄了。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.