这个官方不是有答案么?
https://docs.swift.org/swift-book/LanguageGuide/ClassesAndStructures.html
The additional capabilities that classes support come at the cost of increased complexity. As a general guideline, prefer structures because they’re easier to reason about, and use classes when they’re appropriate or necessary. 粗体部分翻译一下:类的附加功能是以增加复杂性为代价,这就是交易
就是类比起结构来说,特性更多
但是,你可能用不到这么多东西,对于一些场景,普通的结构体就够你用了
我想这有一个重要的原因,就是swift没有gc
所以一些重量级的东西,它就不敢轻易搞,无形中就增加了编程时候的心智负担
java的zgc出来之后,其实new对象这个操作基本上就彻底放开了
随便new,别给我省内存,省了我也不会感谢你
但是前提是,要有zgc,没有zgc的时代,那你就不能这样随便new
因为new太多会造成cms时候的full gc次数增加,从而导致gc暂停时间变长
有了zgc,反正一次也就2ms不到,多数时候在1ms以内解决,那只要内存够,随便new
看swift就不一样了,因为swift没有gc,只有arc,而且需要手动标记weak reference之类的
一些重量级的结构,比如类,就最好不要轻易用了,因为swift没有zgc这种强力的保证
所以你还是自己手动处理一下吧
写swift比写java要复杂一点
不过话说回来,java以后也会增加类似结构的value class,我看java已经完成了初步的版本,估计过几年就可以下发生产了,可能22开始preview吧
因为value class对比普通class,性能更好,而且需要用户标记的地方,比较少
几乎是无痛的,就在一般的class前面加上个value就好了
所以这种交易,看上去还挺划算的,而且这个操作还可以由ide代劳,你现在用idea的话
应该有一种感觉,它会经常提示你用final,一个意思,以后能标记成value或者primitive的地方,idea也会主动提示你标记成value或者primitive的
所以,为什么不?
总结一下:普通的class,对比swift里面的结构以及java的value/primitive class而言,功能更多,但是相比之下,也更复杂,如果没有zgc这种强力的保证的话,你还是手动标记成struct或者value/primitive class比较好,给机器造成的负担会轻一点
但是如果你想粗暴简单写代码的话,在有zgc的前提下,全部用class,也是可以的,看你自己的需求,swift没有gc,更没有zgc,所以心智负担就交到了开发者这边
类似的,dart就有gc,所以dart里面全都是class,flutter里面甚至很多组件是stateful widget,这是非常重量级的组件,stateful和stateless的区别让我想起了ejb
所以有gc,gc强劲的话,很多重量级的东西,就可以随便搞了,复杂就复杂,反正折磨的是gc,不是人,但是如果没有,那人就相应要注意了,写的时候,负担就要高一点 |