博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
单例中静态属性的额外作用
阅读量:6847 次
发布时间:2019-06-26

本文共 1460 字,大约阅读时间需要 4 分钟。

作者:Erica Sadun,,原文日期:2017-01-05

译者:;校对:;定稿:

给我留言道:「是否可以为单例 (singleton) 的共享实例 (shared instance) 定义一个 get 闭包呢?我现在正在编写一个网络 socket 管理器,我希望在每次调用 connect() 的时候都能够匹配到这个实例」。

一个基本的 Swift 单例如下所示:

public final class Singleton {    public static let shared = Singleton()    private init() { }}

这种设计模式创建了一个类,这个类只有一个可访问的共享实例。此外这个类被标记为 final,其构造器的访问域为 private,以确保这个类型不能被继承,也不能通过 shared 之外的方法被实例化。

为了给大家介绍「静态属性的额外作用 (side effect)」,我们创建一个间接访问此单例的静态属性,然后向 getter 方法中添加自定义的行为:

public final class Singleton {    private static let _shared = Singleton()    private init() { }        public static var shared: Singleton {        get {            print("side effects here")            connect() // 举个栗子            return _shared        }    }}

这样写也行,不过这段代码还可以更为精简。对只读属性而言,完全可以移除 get 语法。直接将自定义行为移到最顶层的 var 闭包单重,如以下修改所示:

public final class Singleton {    private static let _shared = Singleton()    private init() { }        public static var shared: Singleton {        print("side effects here")        connect() // 举个栗子        return _shared    }}

来快速总结一下:

  • 对于单例而言,请使用引用类型;

  • 将单例类型标记为 final,其实例标记为 public,构造器标记为 private

  • 在命名的时候,尽量使用更符合 Swift 风格的 shared,而不是 Objective-C 风格的 sharedInstance

  • 如果在获取单例的时候还需要引入其他的额外作用,那么可以创建一个静态的只读属性;

  • 对于只读属性而言,get 语法可以移除以达到精简的效果。

如果大家对这段代码有其他的改进或者建议,就和以前一样,在评论中留言评论,或者在 tweet 上私信我。

Rob N 在这里说得非常好:

「 这篇文章很好,但是我对其中的用例有些顾虑。也就是说 self.websocketWebsocket.shared 相比,它们的行为可能是大相径庭的,即便它们都是同一个对象。

—— Rob Napier (@cocoaphony) 」
本文由 SwiftGG 翻译组翻译,已经获得作者翻译授权,最新文章请访问 。

转载地址:http://mdlul.baihongyu.com/

你可能感兴趣的文章
小白学python系列-(1)环境的安装
查看>>
eclipse 快捷键
查看>>
exchange 2016 EMS控制台报错Winrm HTTP 403
查看>>
java_vuser脚本编写httppost方式发送stream进行接口测试
查看>>
我的友情链接
查看>>
Java调用.NET webservice方法的几种方式
查看>>
Swoole 实例三(Timer定时器)
查看>>
Hyper-V Server 2008 R2安装、配置
查看>>
MYSQL-字符校对规则探究
查看>>
HTTPClient模拟登陆21CN
查看>>
Golang 用指定网卡的IP发送HTTP请求
查看>>
网站安全狗IIS版 V4.0.15586 发布
查看>>
Docker存储驱动之AUFS简介
查看>>
Java中如何封装自己的类,建立并使用自己的类库?
查看>>
Java Http请求工具类
查看>>
iscsi集群搭建
查看>>
Flutter Web - 目标全平台开发的Flutter再下一城!
查看>>
Nginx代理Tomcat
查看>>
Apache与Tomcat的区别
查看>>
mysql—Access denied for user 'root'@'localhost' (using password:NO)
查看>>