MapEntry
的原始代码
class MapEntry<K, V> {
final K key;
final V value;
const factory MapEntry(K key, V value) = MapEntry<K, V>._;
const MapEntry._(this.key, this.value);
}
当你可以简单地拥有:时,需要创建上面的factory
构造函数吗
class MapEntry<K, V> {
final K key;
final V value;
const MapEntry(this.key, this.value);
}
像这样编写构造函数可以有效地使类成为final(类无法从此类扩展(。只有生成构造函数才能用于调用super()
。这与不能以这种方式使用的工厂构造函数相反。由于唯一的生成构造函数是名为_
的私有构造函数,因此阻止了扩展。需要注意的是,同一包中的类可能会扩展该类,因为同一包内的类可以使用私有成员。
通过拥有工厂构造函数,即使默认构造函数是私有的,也仍然可以创建MapEntry
的实例。
class MapEntry<K, V> {
final K key;
final V value;
const factory MapEntry(K key, V value) = MapEntry<K, V>._;
const MapEntry._(this.key, this.value);
}
class ExtendableMapEntry<K, V> {
final K key;
final V value;
const ExtendableMapEntry(this.key, this.value);
}
// ---------------
class GoodChild extends ExtendableMapEntry<int, int>{
GoodChild(int i):super(i,i);
}
// Error:
// The constructor 'MapEntry<int, int> MapEntry(int key, int value)' is a
// factory constructor, but must be a generative constructor to be a valid
// superinitializer - line 24
class ImpossibleChild extends MapEntry<int, int>{
ImpossibleChild(int i):super(i,i);
}