Быстрый ответ
Из комментариев ваша путаница выглядит так:
Я думаю, что смысл в том, что «все поля, доступные для объекта, являются частью состояния объекта». Не так ли?
Нет, это не смысл. Это выражается вопросом, который задает автор:
При каких условиях поля достижимы из данного объекта, не являющегося частью состояния этого объекта?
На что ответят вскоре после:
Классы коллекции часто демонстрируют форму «разделенного владения», при которой коллекция владеет состоянием инфраструктуры коллекции, а код клиента владеет
предметы, хранящиеся в коллекции
Понимание права собственности
Для ясности, владелец определяет, кто может реализовать политику синхронизации для этого состояния.
Во многих случаях владение и инкапсуляция идут вместе - объект инкапсулирует состояние, которым он владеет, и владеет состоянием, которое он инкапсулирует. Это владелец данной переменной состояния, который принимает решение о протоколе блокировки, используемом для поддержания целостности состояния этой переменной
Когда состояние инкапсулировано, клиенты вынуждены взаимодействовать с состоянием через то, что инкапсулировано. Таким образом, инкапсулятор является эксклюзивным владельцем, а безопасность потоков определяется исключительным владельцем.
после публикации ссылки на изменяемый объект у вас больше нет исключительного контроля; в лучшем случае у вас может быть «совместное владение».
Если объект открыт (возможно, через геттер), инкапсулятор теряет исключительное владение, поскольку клиент может теперь игнорировать любые политики, установленные инкапсулятором.
Однако это не меняет того факта, что объект по-прежнему частично принадлежит инкапсулятору - инкапсулятор может по-прежнему применять свою политику, когда клиенты изменяют состояние объекта через инкапсулятор.
Ответ за ..
Почему это может быть подмножество?
Из книги:
Если вы выделяете и заполняете HashMap
, вы создаете несколько объектов: объект HashMap
, несколько объектов Map.Entry
, используемых для реализации HashMap
, и, возможно, также другие внутренние объекты.
A HashMap
состоит из потенциально множества Map.Entry
объектов в форме HashMap#Node
.
Поскольку HashMap
контролирует взаимодействие клиентов с Node
(клиенты не могут создавать новые Node
экземпляры, только с помощью таких методов, как HashMap#putVal
, который определяет состояние, например Node#hash
), состояние Node
считается подмножеством HashMap
.
Ответ за ...
При каких условиях поля, доступные для данного объекта, не являются частью состояния этого объекта?
Из книги:
Классы коллекции часто демонстрируют форму «разделенного владения», когда коллекция владеет состоянием инфраструктуры коллекции, а клиентский код владеет
объекты хранятся в коллекции.
Сервлетам не нужно использовать синхронизацию при вызове set-
Attribute и getAttribute, но им, возможно, придется использовать синхронизацию при использовании объектов, хранящихся в ServletContext
Коллекции не контролируют безопасность потоков своих элементов - клиентам, возможно, придется использовать собственную синхронизацию при использовании элементов, полученных из коллекции.
Поскольку коллекция не контролирует потокобезопасность своих элементов, ей не принадлежит состояние ее элементов; состояние элементов не является подмножеством состояния коллекции, только инфраструктура.