当前位置: 首页 > 面试题库 >

基于Struct和基于类的单例之间有什么区别?

范稳
2023-03-14
问题内容

两种方法是相同的还是要注意的主要差异/陷阱?

class MyClassSingleton {
  static let sharedInstance = MyClassSingleton()
  private init(){}

  func helloClass() { print("hello from class Singleton") }
}

struct MyStructSingleton {
  static let sharedInstance = MyStructSingleton()
  private init() {}

  func helloStruct() { print("hello from struct Singleton") }
}

问题答案:

主要区别是基于类的可变单例有效,而基于结构的可变“单例”无效。除非您想使单身人士不可变(这是很少见的),否则您应该坚持基于类的方式。

这是一个可变的基于结构的“单身”如何工作的例证。考虑将可变成员添加state到两个单例中,如下所示:

class MyClassSingleton {
    static let sharedInstance = MyClassSingleton()
    private init(){}
    var state = 5
    func helloClass() { print("hello from class Singleton: \(state)") }
}

struct MyStructSingleton {
    static let sharedInstance = MyStructSingleton()
    private init() {}
    var state = 5
    func helloStruct() { print("hello from struct Singleton: \(state)") }
}

我做state了一个var,但是我可以将其公开为只读属性和一个变异方法。重要的是这两种类型现在都是可变的。

如果我这样做

let csi = MyClassSingleton.sharedInstance
csi.state = 42
MyClassSingleton.sharedInstance.helloClass()

打印42,因为csi引用了共享实例。

但是,当我对基于结构的单例执行相同的操作时

var ssi = MyStructSingleton.sharedInstance
ssi.state = 42
MyStructSingleton.sharedInstance.helloStruct()

而是打印5,因为ssi是的副本sharedInstance,这当然表明我们的单例实际上不是单例。



 类似资料:
  • 问题内容: 这是过去的考试问题,我想知道什么是原始类型和引用类型?对于数组,我知道引用类型是由对象或变量组成的数组,而原始类型是仅使用int或字符串创建数组的类型。(对?) 您认为您会如何回答测试中的问题并获得良好的信誉?如果没有真正直接引用原始的ARRAY类型,有没有办法做到这一点?还是您只用数组解释一下就可以了。 问题答案: 这些是Java中的原始类型: boolean byte short

  • 问题内容: 将一个使用在另一个上是否有好处?在Python 2中,它们似乎都返回相同的结果: 问题答案: 在将返回2.5并且将返回2。前者是浮点除法,后者是地板除法,有时也称为整数除法。 在或更高版本的2.x行中,除非执行,否则整数没有区别,这会使采取3.0的行为。 不管将来的进口是什么,都会归还,2.0因为这是操作的地板分割结果。

  • 问题内容: 之间是否存在有意义的区别: 与 如果要创建很多实例,这两种样式在性能或空间要求上是否有任何区别?阅读代码时,您是否认为两种样式的含义有明显不同? 问题答案: 除了性能方面的考虑外,还有明显的语义差异。在类属性的情况下,仅引用一个对象。在实例属性设置实例中,可以有多个引用对象。例如

  • 我所理解的是,这三个概念都与长时间运行的事务有关。 null 谁能解释一下它们之间的区别,以及--我特别感兴趣的是--这些概念中的哪一个对什么有好处,以及当你需要什么的时候。它们相互排斥吗?你能只带其中一个一路走下去吗?是否有需要不止一个的场景?……?

  • 问题内容: 这两行有什么区别? 和 要么 问题答案: 没有。 那是完全一样的东西。在第一种情况下,您只有一个补充变量。 请注意,通过自动装箱,您几乎不需要同时拥有和变量。因此,在大多数情况下,这就足够了: Integer有用的主要情况是区分变量未知的情况(即): 但是不要保留两个变量,一个就足够了。

  • 问题内容: 我知道有三种不同的,流行的非SQL数据库类型。 键/值:Redis,Tokyo Cabinet,Memcached ColumnFamily:Cassandra,HBase 文件:MongoDB,CouchDB 我已经读了很长的博客,但对它的了解却很少。 我知道关系数据库,并且在MongoDB / CouchDB等基于文档的数据库中徘徊。 谁能告诉我这些和清单上的两个前者之间的主要区别