объекты каких стандартных классов immutable в java

Содержание
  1. Иммутабельность в Java
  2. Иммутабельность в действии
  3. Иммутабельность строк в Java
  4. Неизменяемые объекты в Java
  5. 1. Обзор
  6. 2. Что такое неизменяемый объект?
  7. 3. Последнее ключевое слово в Java
  8. 4. Неизменяемость в Java
  9. 5. Преимущества
  10. 6. Заключение
  11. Объекты Stateless и Immutable
  12. Что такое stateless объект?
  13. Как создать неизменяемый класс в Java?
  14. Что такое неизменяемый класс в Java?
  15. Преимущества неизменяемого класса в Java
  16. Как создать неизменяемый класс в Java?
  17. Почему глубокое копирование важно для неизменности?
  18. Immutable объекты в Java. Назначение и использование.
  19. Что такое immutable объекты в Java
  20. Основные параметры имутабельных классов (immutable classes)
  21. Практическое применение immutable объектов
  22. Сложные константы
  23. В многопоточности (java tread safety)
  24. В коллекциях
  25. Строки (string) immutable
  26. Перечень часто используемых immutable классов в Java
  27. Дополнительно по теме, для тех кому лень читать:
  28. Related posts
  29. Распределение нагрузки с помощью NGINX в Spring Boot
  30. Обзор работы с опционалами (Optional Java)
  31. Разновидности юнит тестов (unit testing). Основательный подход.
  32. Leave a Comment Отменить ответ

Иммутабельность в Java

Привет, Хабр. В преддверии скорого старта курса «Подготовка к сертификации Oracle Java Programmer (OCAJP)» подготовили для вас традиционный перевод материала.

Приглашаем также всех желающих поучаствовать в открытом демо-уроке «Конструкторы и блоки инициализации». На этом бесплатном вебинаре мы:
— Разберём конструктор на запчасти
— Определим финалистов (финальные переменные)
— Наведём порядок (инициализации)

9fcebc3c12c2ad4ce83d63daef66f95f

Иммутабельный (неизменяемый, immutable) класс — это класс, который после инициализации не может изменить свое состояние. То есть если в коде есть ссылка на экземпляр иммутабельного класса, то любые изменения в нем приводят к созданию нового экземпляра.

Чтобы класс был иммутабельным, он должен соответствовать следующим требованиям:

Должен быть объявлен как final, чтобы от него нельзя было наследоваться. Иначе дочерние классы могут нарушить иммутабельность.

Все поля класса должны быть приватными в соответствии с принципами инкапсуляции.

Для корректного создания экземпляра в нем должны быть параметризованные конструкторы, через которые осуществляется первоначальная инициализация полей класса.

Для исключения возможности изменения состояния после инстанцирования, в классе не должно быть сеттеров.

Для полей-коллекций необходимо делать глубокие копии, чтобы гарантировать их неизменность.

Иммутабельность в действии

Начнем со следующего класса, который, на первый взгляд, выглядит иммутабельным:

Теперь посмотрим на него в действии.

Очевидно, что мы хотим запретить добавление элементов в коллекцию, поскольку это изменение состояния объекта, то есть отсутствие иммутабельности.

Хотя использование иммутабельных объектов дает преимущества, но их использование не всегда оправдано. Обычно нам нужно как создавать объекты, так и модифицировать их для отражения изменений, происходящих в системе.

То есть нам нужно изменять данные, и нелогично создавать новые объекты при каждом изменении, так как это увеличивает используемую память, а мы хотим разрабатывать эффективные приложения и оптимально использовать ресурсы системы.

Иммутабельность строк в Java

Например, в классе String есть методы для получения символов, выделения подстрок, поиска, замены и многие другие. Как и другие классы-обертки в Java (Integer, Boolean и т.д.), класс String является иммутабельным.

Читайте также:  в каких состояниях тело не имеет формы

Иммутабельность строк дает следующие преимущества:

Для строк можно использовать специальную область памяти, называемую «пул строк». Благодаря которой две разные переменные типа String с одинаковым значением будут указывать на одну и ту же область памяти.

Строки отличный кандидат для ключей в коллекциях, поскольку они не могут быть изменены по ошибке.

Чувствительные данные, такие как имена пользователей и пароли, нельзя изменить по ошибке во время выполнения, даже при передаче ссылок на них между разными методами.

Подробнее о курсе «Подготовка к сертификации Oracle Java Programmer (OCAJP)».

Смотреть вебинар «Конструкторы и блоки инициализации».

Источник

Неизменяемые объекты в Java

Узнайте о неизменяемости и о том, как ее можно достичь в объекте Java.

1. Обзор

В этом уроке мы узнаем, что делает объект неизменяемым, как добиться неизменяемости в Java и какие преимущества дает это.

2. Что такое неизменяемый объект?

Это означает, что общедоступный API неизменяемого объекта гарантирует нам, что он будет вести себя одинаково в течение всего срока службы.

3. Последнее ключевое слово в Java

В Java переменные по умолчанию изменяемы, что означает, что мы можем изменить значение, которое они содержат|/.

Используя ключевое слово final при объявлении переменной, компилятор Java не позволит нам изменить значение этой переменной. Вместо этого он сообщит об ошибке во время компиляции:

Обратите внимание, что final запрещает нам изменять только ссылку, содержащуюся в переменной, но не защищает нас от изменения внутреннего состояния объекта, на который она ссылается, с помощью своего общедоступного API:

Второй assertEquals завершится ошибкой, поскольку добавление элемента в список изменяет его размер, следовательно, он не является неизменяемым объектом.

4. Неизменяемость в Java

Теперь, когда мы знаем, как избежать изменений содержимого переменной, мы можем использовать ее для создания API неизменяемых объектов.

Создание API неизменяемого объекта требует от нас гарантии того, что его внутреннее состояние не изменится независимо от того, как мы используем его API.

Шагом вперед в правильном направлении является использование final при объявлении его атрибутов:

Обратите внимание, что Java гарантирует нам, что значение сумма не изменится, это относится ко всем переменным примитивного типа.

В большинстве случаев нам нужны атрибуты объекта для хранения пользовательских значений, а местом инициализации внутреннего состояния неизменяемого объекта является его конструктор:

Как мы уже говорили ранее, для удовлетворения требований неизменяемого API наш класс Money имеет методы только для чтения.

5. Преимущества

6. Заключение

Неизменяемые объекты не изменяют свое внутреннее состояние во времени, они потокобезопасны и не имеют побочных эффектов. Благодаря этим свойствам неизменяемые объекты также особенно полезны при работе с многопоточными средами.

Читайте также:  какие основные принципы деятельности школьных библиотек отражены в конституции рф

Источник

Объекты Stateless и Immutable

facebooktwittertumblrfacebooktwittertumblr

Привет! Это статья о двух типах объектов в Java:

Данные объекты используются в многопоточной среде для того, чтобы быть уверенными что эти объекты не будут изменены каким-либо другим потоком. То есть зафиксировали состояние один раз и все. Иначе нам бы пришлось думать о том как синхронизировать доступ к этим объектам из разных потоков. А это замедляет работу программы.

Что такое stateless объект?

Так что такое «состояние»?

Обычно каждый объект имеет какие-то изменяемые переменные внутри. Например, мы создаем объект Car, и задаем ему:

auto 3309967 640

auto 3309967 640

1

Объект без состояния

Обычно мы создаем объекты так, что они хранят много переменных. И эти переменные изменяются, меняя состояние объекта.

Но это обычно.

Источник

Как создать неизменяемый класс в Java?

Как создать неизменяемый класс в Java? Узнайте, как сделать класс неизменяемым в Java и что такое неизменяемый класс. Неизменяемые классы являются потокобезопасными.

Сегодня мы узнаем о неизменяемом классе в Java. Что такое неизменяемые классы? Преимущества и важность глубокого копирования для неизменности.

Что такое неизменяемый класс в Java?

Неизменяемые объекты – это экземпляры, состояние которых не меняется после инициализации. Например, String является неизменяемым классом, и после создания экземпляра его значение никогда не меняется.

Прочитайте : Почему строка в неизменяемом в Java

Преимущества неизменяемого класса в Java

Неизменяемый класс хорош для целей кэширования, потому что вам не нужно беспокоиться об изменениях значений.

Здесь я предлагаю способ создания неизменяемого класса на примере для лучшего понимания.

Как создать неизменяемый класс в Java?

Чтобы создать неизменяемый класс в Java, вам необходимо выполнить следующие действия.

Чтобы понять пункты 4 и 5, давайте запустим пример конечного класса, который хорошо работает, и значения не изменяются после создания экземпляра.

Чтобы понять пункты 4 и 5, давайте запустим пример конечного класса, который хорошо работает, и значения не изменяются после создания экземпляра.

Результатом приведенного выше примера программы является:

Почему глубокое копирование важно для неизменности?

Давайте прокомментируем конструктор, предоставляющий глубокую копию, и раскомментируем конструктор, предоставляющий неглубокую копию.

Запустите программу после того, как все изменения будут сделаны. Это приведет к следующему результату.

Как вы можете видеть из выходных данных, значения хэш-карты изменились из-за неглубокого копирования в конструкторе.

Это происходит из-за прямой ссылки на исходный объект в функции getter.

Это все для неизменяемого класса в Java. Мы также узнали о важности глубокого копирования для неизменяемых классов.

Источник

Immutable объекты в Java. Назначение и использование.

Stonehenge2007 07 30

Что такое immutable объекты в Java

Это многофункциональные immutable (неизменяемые) объекты, которые можно применять в разных частях программы.

Например, это могут быть неизменяемые объекты в многопоточной среде для работы с данными. Также это могут быть сложные константы, которые помогают избежать излишнего использования памяти и перегрузки сборщика мусора (garbage collector). Отдельно стоит упомянуть иммутабельность при работе с коллекциями.

Читайте также:  на какую кукурузу лучше ловить сазана

Основные параметры имутабельных классов (immutable classes)

Для того чтобы сказать, что класс является immutable (неизменяемым) он должен соотвествовать следующим критериям:

Практическое применение immutable объектов

theory practice business concept old wooden background words learning 66071278

На практике, иммутабельность позволяет строить более стабильные программы и ее принципы зачастую применимы в фундаментальных частях софта.

Например, это могут быть сложные константы и строки, которые могут использоваться, как конфигурация программы или как базовые данные.

Сложные константы

В проекте может быть много статических констант для отображения разных состояний, статусов. Если взять, к примеру, то как работают под капотом базовые классы оберток простых типов можно увидеть что практически все они иммутабельны.

Например, класс Boolean и то как там устанавливаются состояния объекта:

Также пример с BigInteger:

В многопоточности (java tread safety)

Java Concurrency

Иногда, когда объект обрабатывается в многопоточной среде нужно отделить переменные, которые должны быть уникальными в рамках отдельного потока. Для этого может быть много причин.

Для этой цели можно использовать ThreadLocal класс. Ниже приведен пример использования локальных переменных для каждого отдельного потока.

В коллекциях

Как известно, зачастую, некоторые коллекции состоят из пары ключ, значение. Если рассмотреть более подробнее, например, коллекцию HashMap можно увидеть, что благодаря хешу ключа внутренний механизм коллекции определяет в какой бакет нужно положить объект.

Представьте, что ключ будет изменяемым. Допустим вы положили объект в коллекцию с определенным ключем, например, «one». Далее в процессе объект ключа поменял хеш код и внутренние состояние. Буквально значение стало «two».

Из примера выше, очевидно, что значение по ключу «one» мы уже потеряли и достать его из коллекции будет невозможно.

В таком случае имутабельность решает вопрос с потерей объектов в коллекции, так как состояние и хеш код изменить уже нельзя, ничего не теряется.

Строки (string) immutable

944

Строки пожалуй один из самых часто используемых классов. Ранее мы уже писали о String Pool, как хранятся строки в памыти, а также мы делали базовый обзор класса String в Java.

Как известно, сами строки не изменяемые (immutable). Каждый раз когда строка модифицируется, создается новый объект класса String. Поэтому для изменяемых строк сушествуют StringBuilder, StringBuffer.

А как обстоит дело со строковыми литерами? Если например меняется ссылка на строку, меняется ли и значение? Давайте рассмотрим пример:

Так как строки действительно являются не изменяемыми, результат будет очевиден:

Перечень часто используемых immutable классов в Java

Почти все классы обертки примитивных типов: Integer, String, Short, Boolean, BigInteger, BigDecimal и другие.

Дополнительно по теме, для тех кому лень читать:

Распределение нагрузки с помощью NGINX в Spring Boot

java8 optional

Обзор работы с опционалами (Optional Java)

512

Разновидности юнит тестов (unit testing). Основательный подход.

Leave a Comment Отменить ответ

Для отправки комментария вам необходимо авторизоваться.

Источник

admin
Своими руками
Adblock
detector