Правильно ли говорить, что класс DocumentService является неизменным, поскольку невозможно изменить любое из двух его полей (которые являются пружинными компонентами, которые могут быть инициализированы только один раз самим контейнером)?
В соответствии с определением неизменности , и формально говоря, этот класс НЕ является неизменным .
Объект является неизменным, если невозможно изменить состояние объекта, а состояние documentGenerationService
и documentPublishService
является частью состояния класса DocumentService
.
И, как следствие, , если у класса всегда одно и то же состояние, он ведет себя всегда одинаково . Другими словами, нет способа изменить поведение неизменяемого объекта, поскольку поведение объекта зависит только от его состояния, а в неизменяемом объекте это состояние никогда не изменяется (примерами неизменяемых объектов являются строки и целые числа).
Обратите внимание, что в определении неизменяемости мы находим исключение, когда " объект считается неизменным, даже если некоторые [...] атрибуты изменяются, но состояние объекта [и, следовательно, поведение] кажется неизменным [...]", но в этом случае (с предоставленной информацией) изменение состояния ссылок может определенно изменить поведение класса (так как у нас нет никакого контроля на собственное внутреннее состояние).
Существует стратегия , чтобы сделать класс неизменным. Вы уже следуете некоторым из его рекомендаций, но в случае, если вы хотите сделать его неизменным (я думаю, что это не так), вам понадобятся другие, такие как «защитная копия» аргументов, которые вы получите в конструктор и избегают переопределения методов подклассов .
Эта ссылка тоже интересна.
Тем не менее, вы не должны делать бины Spring неизменяемыми, поскольку это не тот способ использования модели программирования, которую предлагает Spring. Таким образом, в данном случае «хорошо», что класс не является неизменным.
В любом случае, может ли bean-компонент DocumentService, как определено выше, считаться поточно-ориентированным?
Как заявлено здесь, этот класс IS потокобезопасен . Многие потоки могут безопасно получить доступ к этому классу без каких-либо условий гонки. Мы не можем сказать то же самое о полях, которые он содержит, но этот класс является потокобезопасным. Это работает точно так же, как и «потокобезопасный список»: он может содержать «нет поточно-безопасных» объектов, но все равно быть «потокобезопасным списком».
А если следовать этой схеме, то приложение в целом будет поточно-ориентированным?
Если все классы вашей системы являются поточно-ориентированными (то есть нигде не появляется ни одного условия гонки), вы можете неофициально сказать, что приложение является поточно-ориентированным.