簡體   English   中英

Dart 中的靜態構造函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM