1. 程式人生 > >帶你Dart帶你飛之類的構造方法

帶你Dart帶你飛之類的構造方法

在前面的系列文章(文章末尾會有傳送門哦~~)都是些比較簡單的基礎概念,之後就要開始介紹一些注重理解和手動實踐的Dart知識了。這篇的內容主要是Dart中的類的構造方法。

Dart是一種面向物件的語言,具有類和基於mixin的繼承。每個物件都是一個類的例項,所有的類都是Object的子類。

核心內容如下

  • 普通構造方法
  • 常量構造方法
  • 初始化列表
  • 工廠構造方法

類的成員

和java語言類似,使用點號(.)引用例項變數或方法

var p = Point(2, 2);
// Set the value of the instance variable y.
p.y = 3;

但它還可以這麼寫

// If p is non-null, set its y value to 4.
p?.y = 4;

這是為避免最左運算元為空時出現異常,使用 ?.代替 .

構造方法

  • 普通構造方法

如果不宣告構造方法,則為您提供預設構造方法。預設構造方法沒有引數,並在超類中呼叫無引數建構函式。

如果有多個構造方法,構造方法的寫法和Java不太一樣。即使構造方法的引數不同,這些構造方法的命名也不能重複

那如果有多個構造方法,我們可以通過ClassName.identifier作為它的構造方法,比如下面的Point.fromJson

class Point{
  var  x;
  var  y;

  Point(var x,var y){
    this.x=x;
    this.y=y;
  }

  Point.fromJson(Map<String, int> map) {
        x=map['x'];
        y=map['y'];
    }    
}

呼叫構造方法

var p1 = new Point(2, 2);
var p2 = new Point.fromJson({'x': 1, 'y': 2});

當然我們這裡的new關鍵字是可以省略的

在Dart2中new關鍵字為可選關鍵字

  • 常量構造方法

 
class ImmutablePoint {
   final num x, y;
   const ImmutablePoint(this.x,this.y);//常量構造方法
}

常量構造方法需要新增關鍵字const,並且是沒有身體的,直接在末尾加;即可

var a = const ImmutablePoint(1, 1);
var b = const ImmutablePoint(1, 1);
assert(identical(a, b));
print(a==b);    //true
print(b);       //Instance of 'ImmutablePoint'

構造兩個相同的編譯時常量會生成一個單一的、規範的例項

在常量上下文中,可以在建構函式或文字之前省略const。例如,它建立了一個const的 map集合

//這裡用來很多const
const pointAndLine = const {
  'point': const [const ImmutablePoint(0, 0)],
  'line': const [const ImmutablePoint(1, 10), const ImmutablePoint(-2, 11)],
};

//可以省略除第一個外的其他const
const pointAndLine = {
  'point': [ImmutablePoint(0, 0)],
  'line': [ImmutablePoint(1, 10), ImmutablePoint(-2, 11)],
};
  • 初始化列表

上面的Point類我們可以這麼寫

Point.fromJson(Map<String, int> map):
    x=map['x'],
    y=map['y']{
    print('In Point.fromJson(): ($x, $y)');
}

呼叫超類構造方法之外,還可以在建構函式主體執行之前初始化例項變數,初始值設定項用逗號分開。

可以通過在初始化列表中使用assert來驗證輸入

Point.withAssert(this.x, this.y) : assert(x >= 0) {
  print('In Point.withAssert(): ($x, $y)');
}

這樣寫有什麼好處呢?

初始化列表在設定final欄位時很方便

我們在構造方法的body裡設定final變數是不能編譯通過,但通過這種方式就是ok的

import 'dart:math';

class Point {
  final num x;
  final num y;
  final num distanceFromOrigin;

  Point(x, y)
      : x = x,
        y = y,
        distanceFromOrigin = sqrt(x * x + y * y);
}

main() {
  var p = new Point(2, 3);
  print(p.distanceFromOrigin);
}

///執行結果
3.605551275463989
  • 工廠構造方法

工廠構造方法可以從快取返回例項,也可以返回子型別的例項
在實現構造方法時使用factory關鍵字,工廠構造方法並不總是建立類的新例項。

class Logger {
  final String name;
  bool mute = false;

   //用於快取已經例項化的物件
  static final Map<String, Logger> _cache =
      <String, Logger>{};

  factory Logger(String name) {
    if (_cache.containsKey(name)) { //如果map快取裡存在直接返回例項
      return _cache[name];
    } else {   //如果map快取裡不存在,則返回新的例項
      final logger =  Logger._test(String name):this.name=name;;
      _cache[name] = logger;
      return logger;
    }
  }

//???
  Logger._internal(this.name);
  

  void log(String msg) {
    if (!mute) print(msg);
  }
}

上面程式碼還是比較好理解的,不知道在我標記問號的那句程式碼你有沒有懵逼?反正我看的時候是感覺有點奇怪的。

其實仔細一研究,它其實等價於這樣的寫法

Logger._internal(String name):this.name=name;

相關推薦

Dart之類構造方法

在前面的系列文章(文章末尾會有傳送門哦~~)都是些比較簡單的基礎概念,之後就要開始介紹一些注重理解和手動實踐的Dart知識了。這篇的內容主要是Dart中的類的構造方法。 Dart是一種面向物件的語言,具有類和基於mixin的繼承。每個物件都是一個類的例項,所有

DartDiao之類(一)

在前面的系列文章(文章末尾會有傳送門哦~~)都是些比較簡單的基礎概念,之後就要開始介紹一些注重理解和手動實踐的Dart知識了。這篇的內容主要是Dart中的類的構造方法。 Dart是一種面向物件的語言,具有類和基於mixin的繼承。每個物件都是一個類的例項,所有的類都是Obje

DartDiao之類(二)

在上一篇部落格,筆者介紹了Dart類的構造方法 帶你Dart帶你Diao之類(一) 這一篇部落格是介紹Dart類的其他內容,主要包括: Getters和Setters 方法 抽象類和抽象方法 隱式介面 繼承 列舉 mi

DartDiao之重要概念

核心內容 最基礎的Dart程式 Dart一些重要的概念 KeyWord(關鍵字) Variable(變數) Final&&Const Dart的內建型別 最基礎的Dart程式 先看一個最基礎的Dart程式 void log(Object

【執行力決定命】第2集《老板開始喜歡著責任心開啟執行力》

執行力、職場、老板、晉升「音頻原文」http://dwz.cn/6sANwk大家好,我是林琳笨,今天和大家一起分享責任心的重要性,為什麽老板喜歡有責任心的人?甚至相親也一定要求對方是一個有責任心的人。所以本期話題我取名《老板開始喜歡你,帶著責任心開啟執行力》責任心的理論定義是:個人對自己和他人、對家庭和集體、

通過位元組碼看原理,去找kotlin中的static方法

kotlin在被欽定為Android的官方開發語言後,越來越多的Android開發者投向kotlin的懷抱。儘管kotlin相容Java,但在使用上還是有很大不同的,就像static關鍵字,我們可以用companion object來替代static,當我們用反射去呼叫時,會發現呼叫時並不像static

《設計模式》之一文理解建造者模式、模板方法、介面卡模式、外觀模式

我的github,到時上傳例子程式碼 https://github.com/tihomcode 《設計模式》之一文帶你理解單例、JDK動態代理、CGLIB動態代理、靜態代理 建造者模式 什麼是建造者模式 建造者模式:是將一個複雜的物件的構建與它的表示分離,使得

一個團隊,怎麼

有人說,管理者面臨的最大問題是:不懂帶團隊!所以,很多管理者往往扮演的是團隊的柺杖、保姆等角色,四處救火,身心俱疲,而整個團隊也缺乏激情,士氣渙散,執行力低下。 帶團隊,不是簡單地發號施令,不是簡單地分解指標,而是一個系統工程。 關於如何帶團隊的1個理念、9個方法,一定會對身為管理者的你有所

史上最全Java面試題(全部答案,可能要收藏!)

原文地址:前幾天,有朋友去面試之前問我關於後端架構相關的問題,但奈於我去年更多的工作是在移動SDK開發上,對此有所遺忘,實屬無奈,後面準備總結下.今天要談的主題是關於求職.求職是在每個技術人員的生涯中都要經歷多次,對於我們大部分人而言,在進入自己心儀的公司之前少不了準備工作,

讀“讓的軟件起來”持續更新代碼運行效率之路

根據 查表 個人 通過 不知道 代碼 時間 方向 詞匯   通過看作者改進代碼運行效率的過程,頗受震撼。以前只是關註一個算法的空間復雜度以及時間復雜度,看到初寫的代碼,就感覺已經沒有可以進行優化的方向了。 但是作者卻采用多種方式,達到了令人驚訝的結果。首先記錄作者的改進的幾

Apache Commons Digester 二(規則模塊綁定-RulesModule、異步解析-asyncParse、xml變量Substitutor、構造方法

對象 property 解決 space getclass bool trace throw object 前言 上一篇對Digester做了基本介紹,也已經了解了Digester的基本使用方法,接下來將繼續學習其相關特性,本篇主要涉及以下幾個內容: 規則模塊綁定,

String構造方法字符編碼集的作用

java charsetjava使用的有unicode默認字符編碼集,所以直接new String("測試".getBytes(),charset)是沒有意義的。在讀取外部數據的時候,才是使用字符編碼集的意義。InputStream is;byte[] b = new byte[is.available()]

java--建立一個預設構造方法(即無參構造)的類,在構造方法中列印一條訊息"Hello Constructor";再為這個類新增一個過載構造方法,令其接收一個字串引數,將其一起打印出來

題目描述:建立一個帶預設構造方法(即無參構造)的類,在構造方法中列印一條訊息"Hello Constructor";再為這個類新增一個過載構造方法,令其接收一個字串引數,並在這個有參構造方法中把"Hello Constructor"和接收的引數一起打印出來。 //Person類 class Pe

面向物件——普通方法構造方法方法方法過載

普通方法   類的方法是為了完成某個特定的應用程式功能存在的,我們要實現程式的某些功能的時候,一般都是某些類的功能,比如上一篇中的學生類,有一個展示學生資訊的方法,我們就可以把它放到學生類裡面(因為只要是學生,他就都有這個展示資訊的功能),而方法是有返回值的,也可以沒有返回值,返回型別為void。有返回值的

java--建立一個預設構造方法(即無參構造)的類,在構造方法中列印一條訊息"Hello Constructor";再為這個類新增一個過載構造方法,令其接收一個字串引數,將其一起打印出來

題目描述:建立一個帶預設構造方法(即無參構造)的類,在構造方法中列印一條訊息"Hello Constructor";再為這個類新增一個過載構造方法,令其接收一個字串引數,並在這個有參構造方法中把"Hello Constructor"和接收的引數一起打印出來。 //Perso

Java之建立一個預設構造方法(即無參構造)的類,在構造方法中列印一條訊息"Hello Constructor";再為這個類新增一個過載構造方法,令其接收一個字串引數。

建立一個帶預設構造方法(即無參構造)的類,在構造方法中列印一條訊息"Hello Constructor";再為這個類新增一個過載構造方法,令其接收一個字串引數,並在這個有參構造方法中把"Hello Constructor"和接收的引數一起打印出來。 效果如下: 附上程

作為一個類,系統都會自動產生一個不引數的構造方法?

首先,這個問題的答案是:錯誤。構造方法是用來建立一個例項的,或者說是建立一個物件。如果類本身沒有寫構造方法,為了讓類能擁有面向物件的能力,那麼開發工具會預設新增一個"不可見的"構造方法,其實就是無參構造方法:class Car { public void color()

Java中 每個類在沒有宣告構造方法的前提下,會自動生成一個不引數的構造方法

每個類在沒有宣告構造方法的前提下,會自動生成一個不帶引數的構造方法,如果類一但宣告有構造方法,就不會產生了.證明如下: 例1: class person { person(){System.out.println("父類-person");} person(int

Java通過反射獲取引數構造方法並使用

package com.sanmao10; import java.lang.reflect.Constructor; public class test2 { /** * ###27.05_反射(通過反射獲取帶參構造方法並使用) *

為何在一個類中定義了引數的構造方法的時候,需要把無參構造方法定義一下

class TestA{    public TestA(String s)    {        System.out.println("A");        System.out.println(s);    }}class TestB extends TestA{