[英]Difference between class constructor syntax in Dart
我有一個我正在創建的類,如下所示:
class Movie {
final String title, posterPath, overview;
Movie(this.title, this.posterPath, this.overview);
Movie.fromJson(Map json) {
title = json["title"];
posterPath = json["poster_path"];
overview = json['overview';
}
}
我收到一條警告說“必須初始化最終變量 'overview', 'posterPath', & '1' more 。每個變量周圍也有警告說 'title' 不能用作 setter,因為它是最終的。
當我使用此語法編寫構造函數時,警告消失:
Movie.fromJson(Map json)
: title = json["title"],
posterPath = json["poster_path"],
overview = json['overview'];
這里到底發生了什么?
在任何人獲得對新對象的引用之前,必須完全初始化 Dart 對象。 由於構造函數的主體可以訪問this
,因此在進入構造函數主體之前需要對對象進行初始化。
要做到這一點,生成 Dart 構造函數有一個初始化列表,看起來類似於 C++,您可以在其中初始化字段,包括最終字段,但您還不能訪問對象本身。 語法:
Movie.fromJson(Map json)
: title = json["title"],
posterPath = json["poster_path"],
overview = json['overview'];
使用初始化列表( :
之后的賦值列表)來初始化最終的實例變量title
、 posterPath
和overview
。
第一個構造函數使用“初始化形式” this.title
將參數直接放入字段中。
構造函數
Movie(this.title, this.posterPath, this.overview);
實際上是以下內容的簡寫:
Movie(String title, String posterPath, String overview)
: this.title = title, this.posterPath = posterPath, this.overview = overview;
您的構造函數可以將所有這些和一個主體結合起來:
Movie(this.title, this.posterPath, String overview)
: this.overview = overview ?? "Default Overview!" {
if (title == null) throw ArgumentError.notNull("title");
}
(const 構造函數不能有一個主體,但它可以有一個初始化列表,對允許的表達式有一些限制,以確保它們可以在編譯時被評估)。
Dart 將屬性初始化與構造函數體分開。
構造函數有 3 個部分:
初始化和正文部分都是可選的。 final
變量必須在前兩部分初始化。 它們不能在體內初始化。
完整的構造函數如下所示:
MyClass(int value)
: assert(value > 0),
property = value,
super();
{
print("Hello World");
}
這個初始化部分的主要目的是用於無體構造函數,它允許 const 構造函數,這是一個 dart 特定的特性。 請參閱const 構造函數實際上是如何工作的? 有關這些的更多詳細信息。
我剛剛找到了一些關於此的文檔,並且它認為第二個版本帶有:
是所謂的“初始化列表”,它允許您在構造函數主體運行之前初始化實例變量。
此處的文檔中有更多詳細信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.