Автор оригинала: Pankaj Kumar.
В этой статье мы рассмотрим использование необязательного класса Java 8 и поймем, что такое класс, основанный на значениях. Каковы сценарии использования класса, основанного на значениях? и, наконец, ознакомьтесь с рекомендациями по использованию по желанию.
Java 8 Необязательно
Необязательно-это объект-контейнер, который может содержать или не содержать ненулевое значение. Вы можете прочитать больше об этом здесь . В Java 9 были некоторые улучшения в необязательном классе , читайте о них здесь .
Зачем использовать Необязательный класс?
- Способствует улучшению и очистке дизайна и кода
- Он объявляет цель и намерение переменной.
- Снижает затраты на тестирование
- Избегает Исключения NullPointerException
- Он поддерживает быстрый подход к программированию
- Удаляет условные проверки котельной плиты.
- Поддерживает свободный стиль
- Способствует использованию функционального стиля программирования.
Необязательно-это класс, основанный на значениях. Мы рассмотрим класс, основанный на значениях, позже в этой статье.
Типы значений
Прежде чем мы углубимся в класс, основанный на значениях, давайте разберемся, что такое тип значения ? Тип значения-это тип данных, который предназначен для передачи по значению в методы и из методов и хранения по значению в структурах данных. Единственными типами значений, которые напрямую поддерживает язык Java, являются восемь примитивных типов.
В статье ” Состояние значений ” Брайан Гетц предложил, чтобы виртуальная машина Java и язык могли быть мягко расширены с помощью нового типа, типа значения, который с пользой сочетает свойства текущих классов Java и примитивных типов, и они должны быть небольшими неизменяемыми и без идентификации.
Тип значения должен быть синонимом “Кодируется как класс, работает как int”.
Класс, Основанный на Ценности
Концепция типа ценности легла в основу классов, основанных на ценности. Упакованная форма каждого типа значений будет классом, основанным на значениях.
Класс, основанный на значениях,-это класс-контейнер, который является оболочкой для типов, основанных на значениях, где экземпляры классов, основанных на значениях, следуют следующему принципу (из документации Java):
- являются окончательными и неизменяемыми (хотя могут содержать ссылки на изменяемые объекты).
- имеют реализации equals, хэш-кода и toString, которые вычисляются исключительно из состояния экземпляра, а не из его идентификатора или состояния любого другого объекта или переменной
- не используйте операции, учитывающие личность, такие как равенство ссылок (==) между экземплярами, идентификационный код экземпляров или синхронизация внутренней блокировки экземпляров
- считаются равными исключительно на основе равенства(), а не на основе ссылочного равенства (==)
- не имеют доступных конструкторов, но вместо этого создаются экземпляры с помощью заводских методов, которые не фиксируют идентичность возвращаемых экземпляров
- являются свободно заменяемыми при равенстве, что означает, что замена любых двух экземпляров x и y, которые равны в соответствии с equals() в любом вычислении или вызове метода, не должна приводить к видимым изменениям в поведении.
Программа может привести к непредсказуемым результатам, если она попытается различить две ссылки на равные значения класса на основе значений, будь то напрямую с помощью равенства ссылок или косвенно с помощью обращения к синхронизации, хэшированию идентификаторов, сериализации или любому другому механизму, учитывающему идентификацию. Использование таких операций, учитывающих личность, в экземплярах классов, основанных на значениях, может иметь непредсказуемые последствия, и их следует избегать.
Проще говоря, экземпляр класса, основанного на значениях, является окончательным, неизменяемым, и эти экземпляры не имеют надлежащего состояния и идентичности, из-за чего определенные операции зависят от личности и должны быть запрещены.
Java постепенно переходит к функциональному стилю программирования, и классы, основанные на ценностях, помогают поддерживать неизменность, которая является неотъемлемым аспектом функционального стиля программирования.
Рекомендации по использованию необязательных классов Java
Java Optional просто считается используемым в контексте замены исключения NullPointerException, и с момента его введения существуют различные сценарии, для которых это рекомендуется, однако, когда мы смотрим на это через призму класса, основанного на значении, мы получаем ограничение и цель использования необязательного:
- Необязательно не следует использовать для проверки на равенство или операций на основе идентификации. Не следует делать следующее:
Он не должен использоваться в качестве ключа в HashMap . Не следует допускать следующего:
- Необязательно не следует использовать в качестве непереходной переменной в сериализуемом классе. Следует избегать следующего:
- Не следует использовать в качестве элемента сущности, данных или класса модели. Эти классы используются для сохранения и, следовательно, нуждаются в идентификации и сериализации; следовательно, мы не должны использовать необязательную переменную экземпляра.
- Необязательный класс Java не должен использоваться для синхронизации. Следует избегать следующего кода:
Необязательный
в первую очередь предназначен для использования в качестве возвращаемого типа метода, где существует явная необходимость представлять ” без результата ” и где использованиеnull
может привести к ошибкам.Переменная, тип которой необязателен, сама по себе никогда не должна быть нулевой; она всегда должна указывать на необязательный экземпляр. Допускается следующий способ кодирования:
Вывод
В этой статье мы выяснили, что такое класс, основанный на значениях? Каковы сценарии использования класса на основе значений и рекомендации по использованию для необязательных.