【问题标题】:static constructor in DartDart 中的静态构造函数
【发布时间】:2020-05-05 16:06:10
【问题描述】:

如何在 Dart 中编写静态构造函数?

class Generator
{
   static List<Type> typesList = [];

   //static
   //{ /*static initializations*/}

}

【问题讨论】:

    标签: dart constructor static


    【解决方案1】:

    Dart 中没有静态构造函数。诸如Shape.circle() 之类的命名构造函数是通过类似的方式实现的

    class A {
      A() {
        print('default constructor');
      }
      A.named() {
        print('named constructor');
      }
    }
    
    void main() {
      A();
      A.named();
    }
    

    您可能也对此factory constructors question感兴趣

    更新:几个静态初始化器解决方法

    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();
      }
    }
    

    【讨论】:

    • 感谢雅各布。似乎 Dart 仍处于开发阶段,缺乏我在 java 中发现的功能,是一种不愉快的体验,或者我可能对 Dart 很陌生......
    • @arif Dart 在 imo 中相当成熟。它没有像 Java 这样的静态初始化程序块,但是还有其他方法可以实现相同的目标。以我的经验,它可以做 Java 可以做的所有事情,而且通常更简洁。我的意思是存在差异,例如不支持嵌套类。
    【解决方案2】:

    您可以通过在构造函数中直接调用 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);
    }
    

    【讨论】:

    【解决方案3】:

    静态变量声明被延迟初始化,以避免在程序启动时进行昂贵的初始化(以及随之而来的缓慢)。第一次读取静态变量 v 时,将其设置为评估其初始化程序的结果。

    https://groups.google.com/a/dartlang.org/forum/#!topic/misc/dKurFjODRXQ

    【讨论】:

      【解决方案4】:

      初始化静态变量的一种解决方法是使用“..”(称为“级联”)运算符。此解决方法不需要对象实例。更多关于级联运算符: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 类型的对象进行初始化,因为所有其他对象都被丢弃了。)

      【讨论】:

        【解决方案5】:

        要在 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());
        }
        

        【讨论】:

          【解决方案6】:

          灵感来自@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;
            }    
             
          }
          

          我也想找到这个问题的官方答案。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-05-06
            • 2023-03-29
            • 2011-03-01
            • 1970-01-01
            • 2011-04-19
            • 2016-05-11
            • 2011-06-11
            • 1970-01-01
            相关资源
            最近更新 更多