当前位置:首页 > 科技  > 软件

从Flutter范儿的单例来看Dart的构造函数

来源: 责编: 时间:2024-05-07 09:03:56 211观看
导读单例模式单例模式应该是设计模式中使用的最广泛的一种设计模式了,在Kotlin中,甚至为它单独创建了一个语法糖——object类,来快速实现单例模式,而在Dart中,并没有像Kotlin这样的语法糖,所以,参考单例的一般实现,我们可以很容易

单例模式

单例模式应该是设计模式中使用的最广泛的一种设计模式了,在Kotlin中,甚至为它单独创建了一个语法糖——object类,来快速实现单例模式,而在Dart中,并没有像Kotlin这样的语法糖,所以,参考单例的一般实现,我们可以很容易的实现下面这样一个单例。nHW28资讯网——每日最新资讯28at.com

class Singleton {  static Singleton? _instance;  // 私有的命名构造函数  Singleton._private() {    // TODO  }  static Singleton getInstance() {    if (_instance == null) {      _instance = Singleton._private();    }    return _instance!;  }}

上面的代码与大部分编程语言的代码都差不多,不外乎就是单例的几个特点:nHW28资讯网——每日最新资讯28at.com

  • 私有构造函数
  • 静态instance访问

在Dart中,变量和函数前面加上「_」就代表私有,但这个私有实际上的含义是「只能在当前文件中访问」,所以,如果在当前文件中,你依然是可以访问这个私有变量或者函数的。另外,由于Dart是单线程模型,所以也不存在线程安全的问题,不用做线程控制。nHW28资讯网——每日最新资讯28at.com

上面的代码,作为一个Dart初学者来说,是无可厚非的,但是对于老司机来说,明显没有Flutter范儿,所以,我们借助Dart的语法糖,来改造下上面的单例代码。nHW28资讯网——每日最新资讯28at.com

class Singleton {  static Singleton? _instance;  // 私有的命名构造函数  Singleton._private() {    // TODO  }  static Singleton get instance => _instance ??= Singleton._private();}

首先,通过「??=」来简化空判断,其次,通过get函数来获取实例,将instance函数变成了instance变量。这样一来,代码简化了不少,而且也更加简单了。nHW28资讯网——每日最新资讯28at.com

不过,这依然不是最具Flutter范儿的单例写法,在Dart中,它提供了一个factory关键字,与Kotlin中的object关键字,有异曲同工之妙,我们来看看官方推荐的单例写法。nHW28资讯网——每日最新资讯28at.com

class Singleton {  static final Singleton _singleton = Singleton._internal();  factory Singleton() => _singleton;  Singleton._internal() {    // TODO  }}

�所谓的factory constructor,它的作用是「仅在第一次创建实例,后续都返回相同的实例」,这不就是天然的单例吗,所以,借助factory constructor,我们可以很方便的写出一个Flutter范儿的单例。nHW28资讯网——每日最新资讯28at.com

构造函数

构造函数是一个类在初始化时,主动调用的函数,在Dart中,有多种不同的构造函数,它们在不同的场景下使用,可以极大的简化我们的代码,同时也让我们的代码更加具有Flutter范儿。nHW28资讯网——每日最新资讯28at.com

默认构造函数

缺省构造函数不用自己创建,如果一个类没有构造函数,那么它会自动添加一个,它什么都不做。nHW28资讯网——每日最新资讯28at.com

// Default Constructorclass Test {  String name = 'xys';  Test();}

在构造函数中初始化变量

Dart提供了多种不同的方式在构造函数中未变量赋值,其中最简单的,就是在构造时初始变量。nHW28资讯网——每日最新资讯28at.com

// Constructor with parametersclass Test {  String name;  Test(this.name);}

其实Test(this.name)实际上就是Test(String name){this.name = name}的简化写法。nHW28资讯网——每日最新资讯28at.com

同时,构造函数也可以增加方法体,进行一些初始化逻辑。nHW28资讯网——每日最新资讯28at.com

// Constructor with the initial methodclass Test {  String name;  Test(this.name) {    // TODO  }}

�当你需要在构造函数初始化时给变量赋值时,可以通过initializer list来实现。nHW28资讯网——每日最新资讯28at.com

// Constructor with initializerclass Test {  String name;    Test(name) : name = handleSth(name);    static String handleSth(String e) => e.toUpperCase();}

initializer list可以初始化多个变量,它们之间可以使用「,」进行分隔,如果有super构造器,那么它一般放在最后。nHW28资讯网——每日最新资讯28at.com

如果你要override基类的变量,那么可以通过super关键字来覆写。nHW28资讯网——每日最新资讯28at.com

// Constructor with super()class Base {  String id;  Base(this.id);}class Test extends Base {  String name;  Test(this.name, String id) : super(id);}

另外,构造函数中,还支持通过Asserts�来做一些检查。nHW28资讯网——每日最新资讯28at.com

// Constructor with assertionclass Test {  String name;  Test(this.name) : assert(name.length > 3);}

对于Dart的参数来说,通常我们设置的都是必选参数,就是类似我们上面的这些参数,而在Dart中,还可以设置可选参数。nHW28资讯网——每日最新资讯28at.com

class Test {  String name;  Test(this.name, [int sex = 0]);}Test('xys', 1);

或者你觉得可选参数在使用时的语义不太明确,那么你可以使用具名参数。nHW28资讯网——每日最新资讯28at.com

class Test {  String name;  Test(this.name, {int sex = 0});}Test('xys', sex: 1);

这样在使用时,语义会更加明确。nHW28资讯网——每日最新资讯28at.com

私有构造函数

私有构造函数,除了我们前面提到的单例使用场景外,下面这个场景,也使用的很多。nHW28资讯网——每日最新资讯28at.com

class Utils {  Utils._();  static void log(String message) => print(message);}

通过私有构造函数,我们可以避免使用者创建工具类的实例,而是让使用者直接调用静态函数。nHW28资讯网——每日最新资讯28at.com

具名构造函数

具名构造函数可以给当前的构造逻辑起一个别名,方便调用者通过语义来进行调用。nHW28资讯网——每日最新资讯28at.com

// Constructor with this()class Test {  String name;  int sex;  Test(this.name, this.sex);  Test.boy(String name) : this(name, 1);  Test.girl(String name) : this(name, 0);}

const构造函数

const构造函数在Flutter中使用的非常多,因为一个const构造函数是不可变的,const构造函数在运行时会指向内存空间的同一个对象,从而提高代码执行的效率,所以,在Flutter中,如果一个Widget是可以定义为const的,那就把它定义为const吧。nHW28资讯网——每日最新资讯28at.com

factory构造函数

factory constructor前面我们已经讲解过了,它可以从另一个构造函数,或者是其它类,返回一个唯一的实例。最常用的场景就是单例的使用,我们来看下它的另一个使用场景,即从缓存中返回唯一实例。nHW28资讯网——每日最新资讯28at.com

class Test {  final String name;  static final _cache = <String, Test>{};  Test._(this.name);  factory Test(name) => _cache[name] ??= Test._(name);}

factory构造函数与static method的区别

在大部分时间,这两者都是非常类似的,甚至是可以混用的,但是它们之间,还是有一些区别的。nHW28资讯网——每日最新资讯28at.com

对于factory constructor来说,它不需要命名,也不用指定通用参数,这样可以减少很多模板代码,我们来看下面这个例子。nHW28资讯网——每日最新资讯28at.com

class ComplexClass<Value, Notifier extends ValueNotifier<Value>> {}

在这个例子中,它包含一个比较复杂的泛型,如果我们要创建一个静态工厂,那么就需要这样:nHW28资讯网——每日最新资讯28at.com

class ComplexClass<Value, Notifier extends ValueNotifier<Value>> {  static ComplexClass<Value, Notifier> someFactory<ComplexClass<Value, Notifier extends ValueNotifier<Value>>() {    // TODO: return a ComplexClass instance  }}

我们需要创建很复杂的参数类型,但是使用factory constructor,则可以避免这些模板代码。nHW28资讯网——每日最新资讯28at.com

class ComplexClass<Value, Notifier extends ValueNotifier<Value>> {  factory ComplexClass.someFactory() {    // TODO: return a ComplexClass instance  }}


nHW28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-86976-0.html从Flutter范儿的单例来看Dart的构造函数

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 用Go语言做了一个分布式限流器, 看看实现的方法与步骤

下一篇: C++强制类型转换详解:四种操作符解析与实例演示

标签:
  • 热门焦点
  • Mate60手机壳曝光 致敬自己的经典设计

    8月3日消息,今天下午博主数码闲聊站带来了华为Mate60的第三方手机壳图,可以让我们在真机发布之前看看这款华为全新旗舰的大致轮廓。从曝光的图片看,Mate 60背后摄像头面积依然
  • 帅气纯真少年!日本最帅初中生选美冠军出炉

    日本第一帅哥初一生选美大赛冠军现已正式出炉,冠军是来自千叶县的宗田悠良。日本一直热衷于各种选美大赛,从&ldquo;最美JK&rdquo;起到&ldquo;最美女星&r
  • 六大权益!华为8月服务日开启:手机免费贴膜、维修免人工费

    8月5日消息,一年一度的华为开发者大会2023(Together)日前在松山湖拉开帷幕,与此同时,华为8月服务日也式开启,到店可享六大专属权益。华为用户可在华为商城Ap
  • 使用LLM插件从命令行访问Llama 2

    最近的一个大新闻是Meta AI推出了新的开源授权的大型语言模型Llama 2。这是一项非常重要的进展:Llama 2可免费用于研究和商业用途。(几小时前,swyy发现它已从LLaMA 2更名为Lla
  • 大厂卷向扁平化

    来源:新熵作者丨南枝 编辑丨月见大厂职级不香了。俗话说,兵无常势,水无常形,互联网企业调整职级体系并不稀奇。7月13日,淘宝天猫集团启动了近年来最大的人力制度改革,目前已形成一
  • 阿里大调整

    来源:产品刘有媒体报道称,近期淘宝天猫集团启动了近年来最大的人力制度改革,涉及员工绩效、层级体系等多个核心事项,目前已形成一个初步的&ldquo;征求意见版&rdquo;:1、取消P序列
  • 华为Mate 60保护壳曝光:硕大后置相机模组 凸起程度有惊喜

    这段时间以来,关于华为新旗舰的爆料日渐密集。据此前多方爆料,今年华为将开始恢复一年双旗舰战略,除上半年推出的P60系列外,往年下半年的Mate系列也将
  • Counterpoint :OPPO双旗舰战略全面落地 高端产品销量增长22%

    2023年6月30日,全球行业分析机构Counterpoint Research发布的《中国智能手机高端市场白皮书》显示,中国智能手机品牌正在寻求高质量发展,中国高端智能
  • 苹果140W USB-C充电器:采用氮化镓技术

    据10 月 30 日 9to5 Mac 消息报道,当苹果推出新的 MacBook Pro 2021 时,该公司还推出了新的 140W USB-C 充电器,附赠在 MacBook Pro 16 英寸机型的盒子里,也支
Top