【发布时间】:2020-05-05 16:06:10
【问题描述】:
如何在 Dart 中编写静态构造函数?
class Generator
{
static List<Type> typesList = [];
//static
//{ /*static initializations*/}
}
【问题讨论】:
标签: dart constructor static
如何在 Dart 中编写静态构造函数?
class Generator
{
static List<Type> typesList = [];
//static
//{ /*static initializations*/}
}
【问题讨论】:
标签: dart constructor static
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();
}
}
【讨论】:
您可以通过在构造函数中直接调用 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);
}
【讨论】:
静态变量声明被延迟初始化,以避免在程序启动时进行昂贵的初始化(以及随之而来的缓慢)。第一次读取静态变量 v 时,将其设置为评估其初始化程序的结果。
https://groups.google.com/a/dartlang.org/forum/#!topic/misc/dKurFjODRXQ
【讨论】:
初始化静态变量的一种解决方法是使用“..”(称为“级联”)运算符。此解决方法不需要对象实例。更多关于级联运算符: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 类型的对象进行初始化,因为所有其他对象都被丢弃了。)
【讨论】:
要在 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());
}
【讨论】:
灵感来自@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;
}
}
我也想找到这个问题的官方答案。
【讨论】: