Dart编码:关于构造函数,这些知识点你都了解吗?

「这是我参与11月更文挑战的第六天,活动详情查看:2021最后一次更文挑战

前言

Flutter 和 Dart 语言都非常容易上手,很多同学在学习 flutter 时都会直接上手 flutter 页面。小轰记得刚开始 flutter 学习时,也是先大致过一遍 Dart 语法,然后对照 UI 直接堆页面。遇到不会的地方直接查 flutter 控件表。

回顾当时的代码,真有点惨不忍睹。当时对 Dart 语言一知半解,后续,通过积累总结,代码质量也逐渐改善。下面跟大家总结一下 Dart 构造函数的 语法使用规范,方便查阅。

构造函数类型

Dart 构造函数有4种类型

ClassName(...) //普通构造函数
Classname.identifier(...) //命名构造函数
const ClassName(...) //常量构造函数
factroy ClassName(...) //工厂构造函数
复制代码

命名构造函数

class Test {
    int x;
    //普通构造函数
    Test(this.x);
    
    //命名构造函数
    Test.origin()
    : x = 0;
}
复制代码

命名构造函数不可继承,如果子类想要有 和父类一样的命名构造函数,那就写个同名的(通常会在子类的命名构造函数里,调用父类的同名命名构造函数)

常量构造函数

使用 const 创建常量构造方法,要求所有成员属性使用 final 修饰

class ConstModel {
  final int paramA;

  const ConstModel(this.paramA);
}
复制代码

当你调用多个一样参数的常量构造时,你获取的是同一个对象,从而节省内存开销和运行效率。【单例】

工厂构造函数

  • 用法一: 工厂构造函数不需要每次构建新的实例,且不会自动生成实例,而是通过代码来决定返回的实例对象,可以把 factory 方法理解成一个中转站
class FactoryModel {

  static final HashMap<String, FactoryModel> _cachedMap = HashMap<String, FactoryModel>();

  FactoryModel._newInstance();

  factory FactoryModel(String key) {
    if (_cachedMap.containsKey(key)) {
      return _cachedMap[key];
    } else {
      _cachedMap[key] = FactoryModel._newInstance();
      return _cachedMap[key];
    }
  }
}
复制代码
  • 用法二:用来实现单例
class Singleton {

  static final Singleton _singleton = Singleton.internal();
  factory Singleton() => _singleton;

  Singleton.internal();
}
复制代码

另外,工厂构造函数可以与命名构造函数常量构造函数结合使用

///常量构造函数
const TestModule(this.x);

///工厂构造函数 + 命名构造函数
factory TestModule.fromJson(Map map){
    ...省略
    return TestModule(map['x']);
}
复制代码

构造传值:要尽可能的使用初始化形式

///不推荐
class Test{
    int x;
    Test(int x)
    : x = x;
}
复制代码
///推荐
class Test{
    int x;
    Test(this.x);
}
复制代码

在构造函数中会被初始赋值的字段不要使用 late 进行修饰

///不推荐
class Test{
    late int x;
    Test(int p){
        x = p + 1;
    }
}
复制代码
///推荐
class Test{
    int x;
    Test(int p)
    : x = p + 1;
}
复制代码

使用 ; 来代替空的构造函数体 {}

///不推荐
class Test{
    int x;
    Test(this.x){}
}
复制代码
///推荐
class Test{
    int x;
    Test(this.x);
}
复制代码

不要使用 new

///推荐
child: Text('hi')

///不推荐
child: new Text('hi')
复制代码

推荐使用 final 对成员变量创建只读属性

使用 final 修饰的字段只可赋值一次,不可更改,具有只读属性

class Test{
    final int x;
    Test(this.x);
}
复制代码

命名构造函数的继承:子类构造函数需显式调用父类的构造函数

class Father {
    Father.fromJson(Map map){
        ...省略
    }
}

class Son extends Father {
    Son.fromJson(Map map) : super.fromJson(map) {
        ...省略
    }
}
复制代码

私有构造函数

使用_下划线进行私有声明

class TestModule {
    //私有构造函数
    TestModule._origin();
}
复制代码

猜你喜欢

转载自juejin.im/post/7035148966291308580