Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么一个对象';s state是否是对象图中以该对象为根的字段的子集?_Java_Oop - Fatal编程技术网

Java 为什么一个对象';s state是否是对象图中以该对象为根的字段的子集?

Java 为什么一个对象';s state是否是对象图中以该对象为根的字段的子集?,java,oop,Java,Oop,我正在阅读“Java并发性的实践”,首先,它说: 对象的状态从其字段开始。如果它们都是基元类型,则字段构成整个状态 如果对象具有引用其他对象的字段,则其状态也将包含引用对象中的字段 然后它说: 对象的状态可以是以该对象为根的对象图中字段的子集。为什么它可能是一个子集?在什么条件下可以从给定对象访问字段而不是该对象状态的一部分 我在书中找不到这两个问题的答案 为什么它可能是一个子集? 在什么条件下,可以从给定对象访问的字段不是该对象状态的一部分? 我完全不明白上面的两句话。这对我来说似乎是矛盾

我正在阅读“Java并发性的实践”,首先,它说:

对象的状态从其字段开始。如果它们都是基元类型,则字段构成整个状态

如果对象具有引用其他对象的字段,则其状态也将包含引用对象中的字段

然后它说:

对象的状态可以是以该对象为根的对象图中字段的子集。为什么它可能是一个子集?在什么条件下可以从给定对象访问字段而不是该对象状态的一部分

我在书中找不到这两个问题的答案

  • 为什么它可能是一个子集?
  • 在什么条件下,可以从给定对象访问的字段不是该对象状态的一部分?
我完全不明白上面的两句话。这对我来说似乎是矛盾的。有人能举一个例子来说明“对象的状态是对象图中以该对象为根的字段的子集”并回答这两个问题吗?

快速回答 从评论中,您的困惑似乎是:

我认为其含义是“所有可从am对象访问的字段都是对象状态的一部分”。不是吗

不,不是这个意思。作者提出的问题表明了这一点:

在什么条件下可以从给定对象访问字段而不是该对象状态的一部分

很快就会得到答复:

集合类通常表现出一种形式的“分割所有权”,其中集合拥有集合基础结构的状态,但客户端代码拥有 集合中存储的对象


理解所有权 为清楚起见,所有权决定了谁可以为该状态实施同步策略

在许多情况下,所有权和封装是同时进行的。对象封装了它所拥有的状态和它所封装的状态。给定状态变量的所有者可以决定用于维护该变量状态完整性的锁定协议

当状态被封装时,客户端被迫通过封装它的任何东西与状态交互。因此,封装器是独占所有者,线程安全由独占所有者决定

一旦发布对可变对象的引用,就不再具有独占控制权;充其量,您可能拥有“共享所有权”

如果对象被公开(可能通过getter),封装器将失去独占所有权,因为客户端现在可能会绕过封装器设置的任何策略

但是,这并没有改变对象仍然部分归封装器所有的事实——当客户端通过封装器修改对象的状态时,封装器仍然可以强制执行其策略


回答 为什么它可能是一个子集

书中:

如果分配并填充一个
HashMap
,您将创建多个对象:
HashMap
对象、实现
HashMap
所使用的许多
Map.Entry
对象,可能还有其他内部对象

HashMap
由潜在的许多
Map.Entry
对象组成,形式为

由于
HashMap
可以控制客户端如何与
节点
交互(客户端可能不会创建新的
节点
实例,只能通过
HashMap#putVal
等方法来确定状态,如
节点#hash
),因此
节点
的状态被视为
HashMap
的子集


回答 在什么条件下可以从给定对象访问字段而不是该对象状态的一部分

书中:

集合类通常表现出一种形式的“分割所有权”,其中集合拥有集合基础结构的状态,但客户端代码拥有 存储在集合中的对象


servlet在调用set时不需要使用同步- 属性和getAttribute,但在使用存储在ServletContext中的对象时,它们可能必须使用同步

集合无法控制其元素的线程安全性—当使用从集合接收的元素时,客户端可能必须实现自己的同步


由于集合无法控制其元素的线程安全性,因此它不拥有其元素的状态;元素的状态不是集合状态的子集,只是基础结构。

下一句陈述:“当定义哪些变量构成对象的状态时,我们只考虑对象拥有的数据”——第一个问题是用<代码> HashMap < /Cult>例子来回答的。我相信第二个问题的答案在集合示例中得到了表达:“集合类通常表现出一种“分割所有权”形式,其中集合拥有集合基础结构的状态,但客户端代码拥有集合中存储的对象”是的,书中说:“是给定状态变量的所有者决定用于维护该变量状态完整性的锁定协议”。没错,列表中有一个对象字段,这就是为什么它被视为/创造了“分割所有权”。集合拥有对象的包含(即数组),但对所述容器中的对象不具有独占所有权。虽然容器持有对象,但这些对象的状态不会影响容器,因此这些对象的状态不应被视为集合状态的子集。请记住:“语言中没有明确体现所有权,相反,它是类设计的一个元素。”-你不会发现我对这些想法有任何明确的概念