Для чего используется оператор assert?

CORE

вопросы-ответы Хилькевич Игорь 15.04.2020

 

Вопросы из “all question”

ООП

1. Что такое ООП, принципы ООП (наследование, инкапсуляция, полиморфизм, абстракция).

2. Класс, объект, интерфейс.

3. Ассоциация, агрегация, композиция.

4. Является - "is a", имеет - "has a".

5. Статическое и динамическое связывание.

Core

6. JRE, JDK, JVM, JIT...

7. Ключевые слова: abstract, assert, break, case, catch, class, const*, continue, default, do, else, enum, extends, final, finally, for, goto*, if, implements, import, instanceof, interface, native, new, package, return, static, strictfp, super, switch, synchronized, this, throw, throws, transient, try, void, volatile, while. * - зарезервированное слово, не используется.

8. Модификаторы доступа: private, default, protected, public.

9. Типы данных: примитивные (boolean, char, byte, short, int, long, float, double) и ссылочные.

10. Логические операторы.

11. Абстрактный класс vs. интерфейс (+ маркерные интерфейсы, функциональные интерфейсы).

12. Типы классов (вложенные, вложенные статические, анонимные, локальные).

13. Блоки инициализации.

14. Порядок вызова конструкторов и блоков инициализации с учётом иерархии классов.

15. Перегрузка и переопределение статических и нестатических методов.

16. Тип возвращаемого значения метода при перегрузке и переопределении + модификаторы доступа.

17. Исключения (иерархия, обработка, finally, try с ресурсами, Closeable vs. Autocloseable, проверяемые vs. непроверяемые, supressed).

18. Garbage collector (виды в HotSpot, типы ссылок, finalize()).

19. Heap vs. stack.

20. Передача переменных в методы.

21. Приведение типов (понижение, повышение типа, ClassCastException).

22. Класс Object (нативные методы, JNA, equals(), hashcode(), toString(), getClass(), clone(), notify(), notifyAll(), 3 вида wait(), finalize()).

23. String (immutable, string pool, intern(), StringBuilder, StringBuffer, String in switch).

24. Клонирование объектов (поверхностная, глубокая копия, Cloneable, конструктор копирования).

25. Сериализация объектов (transient, Serializable vs. Externalizable, serialVersionUID, проблема сериализации синглтона).

26. Классы загрузчики и динамическая загрузка классов.

27. Рефлексия.

28. Контракты equals() и hashcode(). Преимущество использования числа 31 в генерации хэшкода.

29. Дженерики (инвариантность, ковариантность и контрвариантность, raw types, wildcards, PECS, множественные ограничения, стирание типов).

Потоки ввода/вывода

30. java.io vs. java.nio & File vs Path.

31. java.util.zip

32. Channels.

33. Виды (классы) потоков ввода/вывода (байтовые (java.io.InputStream, java.io.OutputStream) и символьные (java.io.Reader, java.io.Writer)).

34. Классы для работы с файловой системой.

35. Абсолютный и относительный путь.

36. Символьная ссылка.

Java 8

37. Методы интерфейсов по умолчанию.

38. Лямбда-выражения и ссылка на метод или конструктор.

39. Stream API (как создать стрим, промежуточные и терминальные операции, вернуть пустой стрим и зачем).

40. Работа с датами и временем.

41. Функциональные интерфейсы.

42. Проверяемые аннотации и аннотации на типы данных (понятие аннотации).

Java Collection Framework (JCF)

43. Понятие коллекции.

44. Иерархия коллекций.

45. List vs. Set.

46. Map не в Collection.

47. Collection vs. Collections.

48. ArrayList vs. LinkedList.

49. Предназначение метода remove() у Iterator. Fail-Fast vs. Fail-Safe.

50. Iterable & Iterator. Enumerated vs. Iterator.

51. Comparator vs. Comparable.

52. Iterator vs. ListIterator.

53. ArrayList vs. Vector.

54. Queue vs. Deque.

55. PriorityQueue.

56. HashMap vs. HashTable.

57. Устройство HashMap.

58. TreeSet vs. HashSet vs. LinkedHashSet.

59. EnumSet.

60. TreeMap & LinkedHashMap.

61. NavigableSet

Дополнительно

62. SOLID с реальными примерами.

63. Класс Optional.

64. Ромбовидное наследование.

Ответы

 

ООП

1. Что такое ООП, принципы ООП (наследование, инкапсуляция, полиморфизм, абстракция).

Объектно-ориентированное программирование (ООП) — методология программирования, основанная на представлении программы в виде совокупности объектов, каждый из которых является экземпляром определенного класса, а классы образуют иерархию наследования.

● объектно-ориентированное программирование использует в качестве основных логических конструктивных элементов объекты, а не алгоритмы;

● каждый объект является экземпляром определенного класса

● классы образуют иерархии.

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

Согласно парадигме ООП программа состоит из объектов, обменивающихся сообщениями. Объекты могут обладать состоянием, единственный способ изменить состояние объекта - послать ему сообщение, в ответ на которое, объект может изменить собственное состояние.

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

Цель инкапсуляции — уйти от зависимости внешнего интерфейса класса (то, что могут использовать другие классы) от реализации. Чтобы малейшее изменение в классе не влекло за собой изменение внешнего поведения класса.

Наследование – это свойство системы, позволяющее описать новый класс на основе уже существующего с частично или полностью заимствующейся функциональностью.

Класс, от которого производится наследование, называется предком, базовым или родительским. Новый класс – потомком, наследником или производным классом.

Полиморфизм – это свойство системы использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта.

Преимуществом полиморфизма является то, что он помогает снижать сложность программ, разрешая использование одного и того же интерфейса для задания единого набора действий. Выбор же конкретного действия, в зависимости от ситуации, возлагается на компилятор языка программирования. Отсюда следует ключевая особенность полиморфизма - использование объекта производного класса, вместо объекта базового (потомки могут изменять родительское поведение, даже если обращение к ним будет производиться по ссылке родительского типа).

Абстрагирование – это способ выделить набор общих характеристик объекта, исключая из рассмотрения частные и незначимые. Соответственно, абстракция – это набор всех таких характеристик.

 

2. Класс, объект, интерфейс.

Класс – это способ описания сущности, определяющий состояние и поведение, зависящее от этого состояния, а также правила для взаимодействия с данной сущностью (контракт).

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

С точки зрения структуры программы, класс является сложным типом данных.

Объект (экземпляр) – это отдельный представитель класса, имеющий конкретное состояние и поведение, полностью определяемое классом. Каждый объект имеет конкретные значения атрибутов и методы, работающие с этими значениями на основе правил, заданных в классе.

Интерфейс – это набор методов класса, доступных для использования. Интерфейсом класса будет являться набор всех его публичных методов в совокупности с набором публичных атрибутов. По сути, интерфейс специфицирует класс, чётко определяя все возможные действия над ним.

 

3. Ассоциация, агрегация, композиция.

Ассоциация обозначает связь между объектами. Композиция и агрегация — частные случаи ассоциации «часть-целое».

Агрегация предполагает, что объекты связаны взаимоотношением «part-of» (часть). Композиция более строгий вариант агрегации. Дополнительно к требованию «part-of» накладывается условие, что экземпляр «части» может входить только в одно целое (или никуда не входить), в то время как в случае агрегации экземпляр «части» может входить в несколько целых.

 

4. Является - "is a", имеет - "has a".

«является» подразумевает наследование. «имеет» подразумевает ассоциацию (агрегацию или композицию).

 

5. Статическое и динамическое связывание.

Присоединение вызова метода к телу метода называется связыванием. Если связывание проводится компилятором (компоновщиком) перед запуском программы, то оно называется статическим или ранним связыванием (early binding).

В свою очередь, позднее связывание (late binding) это связывание, проводимое непосредственно во время выполнения программы, в зависимости от типа объекта. Позднее связывание также называют динамическим (dynamic) или связыванием на стадии выполнения (runtime binding). В языках, реализующих позднее связывание, должен существовать механизм определения фактического типа объекта во время работы программы, для вызова подходящего метода. Иначе говоря, компилятор не знает тип объекта, но механизм вызова методов определяет его и вызывает соответствующее тело метода. Механизм позднего связывания зависит от конкретного языка, но нетрудно предположить, что для его реализации в объекты должна включаться какая-то дополнительная информация.

Для всех методов Java используется механизм позднего (динамического) связывания, если только метод не был объявлен как final (приватные методы являются final по умолчанию).

 

Core

6. JRE, JDK, JVM, JIT…

JVM, Java Virtual Machine (Виртуальная машина Java) — основная часть среды времени исполнения Java (JRE). Виртуальная машина Java исполняет байт-код Java, предварительно созданный из исходного текста Java-программы компилятором Java. JVM может также использоваться для выполнения программ, написанных на других языках программирования.

JRE, Java Runtime Environment (Среда времени выполнения Java) - минимально-необходимая реализация виртуальной машины для исполнения Java-приложений. Состоит из JVM и стандартного набора библиотек классов Java.

JDK, Java Development Kit (Комплект разработки на Java) - JRE и набор инструментов разработчика приложений на языке Java, включающий в себя компилятор Java, стандартные библиотеки классов Java, примеры, документацию, различные утилиты.

Коротко: JDK - среда для разработки программ на Java, включающая в себя JRE - среду для обеспечения запуска Java программ, которая в свою очередь содержит JVM - интерпретатор кода Java программ.

JIT -компиляция (англ. Just-in-time compilation, компиляция «на лету»), динамическая компиляция (англ. dynamic translation) — технология увеличения производительности программных систем, использующих байт-код, путём компиляции байт-кода в машинный код или в другой формат непосредственно во время работы программы.

 

7. Ключевые слова: abstract, assert, break, case, catch, class, const*, continue, default, do, else, enum, extends, final, finally, for, goto*, if, implements, import, instanceof, interface, native, new, package, return, static, strictfp, super, switch, synchronized, this, throw, throws, transient, try, void, volatile, while. * - зарезервированное слово, не используется.

Для чего используется оператор assert?

Assert (Утверждение) — это специальная конструкция, позволяющая проверять предположения о значениях произвольных данных в произвольном месте программы. Утверждение может автоматически сигнализировать об обнаружении некорректных данных, что обычно приводит к аварийному завершению программы с указанием места обнаружения некорректных данных.

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

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

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

В Java проверка утверждений реализована с помощью оператора assert, который имеет форму:

assert [Выражение типа boolean]; или assert [Выражение типа boolean]: [Выражение любого типа, кроме void];

Во время выполнения программы в том случае, если проверка утверждений включена, вычисляется значение булевского выражения, и если его результат false, то генерируется исключение java.lang.AssertionError. В случае использования второй формы оператора assert выражение после двоеточия задаёт детальное сообщение о произошедшей ошибке (вычисленное выражение будет преобразовано в строку и передано конструктору AssertionError).

 


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: