Lau*_*Roy 16 immutability stateless
我经常听到"无国籍"和"不可改变"这个词.例如,HTTP是无状态协议,String对象是不可变对象.但我很难掌握两者之间的差异.当我创建无状态对象时,它不会在内部存储任何"状态"数据.如果我创建一个Immutable对象,它意味着它永远不会改变.
这是不是意味着同样的事情?
由于不可变对象不会改变,因此根据定义它不能具有状态.它永远是它.如果一个对象没有状态,则不能进行变异(根据定义).因此,并非所有无状态对象都是不可变和不可变对象无状态的吗?
什么可以是可变无状态对象或不可变状态对象的示例?
小智 7
背景很重要,这里有两个不相关的概念.
"HTTP是无状态协议"意味着每个请求都没有其他请求的隐含知识,包括同一客户端发送的任何先前请求.这与FTP或SMTP之类的协议不同,在协议中建立连接然后发送不同的命令 - 每个命令/请求"关联"到同一客户端/连接.当然,状态/跟踪会通过添加回来.cookie和跟踪URI,甚至流水线 - 但重点是HTTP协议中的每个请求都是"新的"和"分离的".
"String是一个不可变对象"意味着该特定对象的数据将始终与每个可观察方式的数据相同(这也意味着无法更改可观察属性).一些纯粹主义者可能认为它具有比这更深刻的含义,但实际上是关于可观察的属性 - 当不可变对象可以"包含"可变对象时,问题变得更加复杂.
(是的,通过技术性,一个没有允许数据的对象- 或状态 - 无法更新,因此是"不可变的".然而,再一次,上下文很重要,谈论大象或树干上的Fangs很奇怪在老虎身上.)
没有状态的对象是无状态的.所有无状态对象都是不可变的(因为没有任何变异); 这是一种同义反复的技术性.对象可以具有状态并且仍然是不可变的 - 但是,具有状态(不可变或其他)的对象不能再被视为无状态.根据链接答案的评论:"[一个不可变对象]只有一个状态",即初始状态.
- 从我的评论