所以在dart将new关键字设置为可选之后,
我们可以使用完全相同的语法但不同的内部实现来初始化一个对象。
class Color {
int r = 0, g = 0, b = 0;
Color({this.r, this.b, this.g});
//Named constructors
Color.red() //Implementation
Color.cyan() //Implementation
// Static Initializers
static Color red() => //Initialze with parameter
static Color cyan() => //Initialze with parameter
}
Run Code Online (Sandbox Code Playgroud)
我们可以像这样使用它们,无论它是named constructoror static method:
Color red = Color.red();
Color cyan = Color.cyan();
Run Code Online (Sandbox Code Playgroud)
它们各自的用途是什么?
实际上,工厂构造函数和静态方法之间几乎没有区别。
对于泛型类,它改变了您可以(并且必须)编写类型参数的位置:
class Box<T> {
T value;
Box._(this.value);
factory Box.withValue(this.value) => Box<T>._(value);
static Box<T> fromValue<T>(T value) => Box<T>._(value);
}
...
var box1 = Box<int>.withValue(1);
var box2 = Box.fromValue<int>(2);
Run Code Online (Sandbox Code Playgroud)
因此,对于泛型类,工厂构造函数通常就是您想要的。它们有最令人愉快的语法。
对于非泛型类,差异很小,因此主要是关于信号意图。并决定名称在 DartDoc 中属于哪个类别。
如果函数的主要目标是创建一个新对象,请将其设为构造函数。
如果主要目标是进行一些计算并最终返回一个对象(即使它是一个新对象),请将其设为静态函数。这就是为什么parse方法通常是静态函数。
简而言之,做适合您的 API 的事情。
小智 4
构造函数和静态函数是不同的。您通常创建一个命名构造函数,该构造函数返回具有一些预定义值的对象实例。例如,您有一个名为Personwhich 存储Name和 的类Job。您可以创建这个命名构造函数Person.doctor(name),您将返回一个Person对象Job = 'doctor'
class Person{
final name;
final job;
Person(this.name, this.job);
Person.doctor(this.name, {this.job = "doctor"});
}
Run Code Online (Sandbox Code Playgroud)
静态函数或变量保留在类的所有实例上。假设Person有一个名为 的静态变量count。每当创建的实例时,都会增加计数变量Person。您可以稍后在代码中的任何位置调用以获取(Number ofInstances of )Person.count的值countPerson
class Person{
final name;
final job;
static int count;
Person(this.name, this.job){
count++;
}
Person.doctor(this.name, {this.job = "doctor"});
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2501 次 |
| 最近记录: |