MapEntry 类中的工厂构造函数有什么好处?



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

相关内容

最新更新