История эволюции интерфейсов в Java

Интерфейсы в Java 1.0 были достаточно простыми по сравнению с тем, какие они сейчас. Они могли содержать лишь два типа элементов: константы и публичные абстрактные методы.
Поля-константы
Интерфейсы могут содержать поля, так же как и обычные классы, но с несколькими отличиями:
- Поля должны быть проинициализированы
- Поля считаются публичными статическими финальными
- Модификаторы public, static и final не нужно указывать явно (они «проставляются» по умолчанию)
Даже несмотря на то, что явно это не задано, поле MY_CONSTANT считается публичной статической финальной константой. Вы можете добавить эти модификаторы, но делать это не обязательно.
Абстрактные методы
Наиболее важными элементами интерфейса являются его методы. Методы интерфейса также отличаются от методов обычного класса:
- У методов нет тела
- Реализация методов предоставляется классами, реализующими данный интерфейс
- Методы считаются публичными и абстрактными даже, если это не задано явно
- Методы не могут быть финальными, поскольку в Java комбинация модификаторов abstract и final запрещена
Вложенность
Java 1.1 представила концепцию классов, которые можно размещать внутри других классов. Такие классы бывают двух видов: статические и нестатические. Интерфейсы так же могут содержать внутри себя другие интерфейсы и классы.
Даже если это не задано явно, такие интерфейсы и классы считаются публичными и статическими.
Перечисления и аннотации
В Java 5 были введены ещё два типа: Перечисления и Аннотации. Они также могут быть помещены внутрь интерфейсов.
Обобщенные типы
Java 5 ввела концепцию «дженериков» — обобщенных типов. Вкратце: «дженерики» позволяют вам использовать обобщенный тип вместо указания конкретного типа. Таким образом, вы можете писать код, который работает с различным количеством типов, не жертвуя при этом безопасностью и не предоставляя отдельную реализацию для каждого типа.
В интерфейсах, начиная с Java 5, вы можете определить обобщенный тип, а затем использовать его в качестве типа возвращаемого значения метода или в качестве типа аргумента метода.
Интерфейс Box работает независимо от того, используете ли вы его для хранения объектов типа String, Integer, List, Shoe или каких-либо других.
Статические методы
Начиная с Java 8, вы можете включать в интерфейсы статические методы. Данный подход изменил привычный для нас способ работы интерфейса. Они теперь работают совсем не так, как работали до Java 8. Первоначально все методы в интерфейсах были абстрактными. Это означало, что интерфейс предоставлял лишь сигнатуру, но не реализацию. Реализация оставалась за классами, реализующими ваш интерфейс.
При использовании статических методов в интерфейсах вам нужно также предоставить реализацию тела метода. Чтобы задействовать в интерфейсе такой метод, просто используйте ключевое слово static. Статические методы считаются публичными по умолчанию.
Наследование статических методов
В отличие от обычных статических методов, статические методы в интерфейсах не наследуются. Это означает, что если вы хотите вызвать такой метод, вы должны вызвать его напрямую из интерфейса, а не из реализующего его класса.
Это поведение очень полезно для избежания проблем при множественном наследовании. Представьте, что у вас есть класс, реализующий два интерфейса. У каждого из интерфейсов есть статический метод с одинаковым именем и сигнатурой. Какой из них должен быть использован в первую очередь?
Почему это полезно
Представьте, что у вас есть интерфейс и целый набор вспомогательных методов, которые работают с классами, реализующими этот интерфейс.
Традиционно существовал подход в использовании класса-компаньона. В дополнение к интерфейсу создавался утилитный класс с очень похожим именем, содержащий статические методы, принадлежащие интерфейсу.
Вы можете найти примеры использования данного подхода прямо в JDK: интерфейс java.util.Collection и сопутствующий ему утилитный класс java.util.Collections.
Со статическими методами в интерфейсах этот подход больше не актуален, не нужен и не рекомендован. Теперь вы можете иметь все в одном месте.
Методы по умолчанию
Методы по умолчанию похожи на статические методы тем, что для них вы также должны предоставлять тело. Чтобы объявить метод по умолчанию, просто используйте ключевое слово default.
В отличие от статических методов, методы по умолчанию наследуются классами, реализующими интерфейс. Что важно, такие классы могут при необходимости переопределять их поведение.
Хотя есть одно исключение. В интерфейсе не может быть методов по умолчанию с такой же сигнатурой, как у методов toString, equals и hashCode класса Object. Взгляните на ответ Брайана Гетца, чтобы понять обоснованность такого решения: Allow default methods to override Object’s methods.
Почему это полезно
Идея с реализацией методов прямо в интерфейсе выглядит не совсем правильной. Так почему в первую очередь была введена эта функциональность?
У интерфейсов есть одна проблема. Как только вы предоставите свой API другим людям, он навсегда «окаменеет» (его нельзя будет изменить безболезненно).
По традиции, Java очень серьезно относится к обратной совместимости. Методы по умолчанию предоставляют способ расширить существующие интерфейсы новыми методами. Наиболее важно то, что методы по умолчанию уже предоставляют определенную реализацию. Это означает, что классам, реализующим ваш интерфейс, не нужно реализовывать какие-либо новые методы. Но, если в этом будет необходимость, методы по умолчанию можно будет переопределить в любое время, если их реализация перестанет подходить. Таким образом, вкратце, вы можете предоставить новую функциональность существующим классам, реализующим ваш интерфейс, сохраняя при этом совместимость.
Конфликты
Давайте представим, что у нас есть класс, реализующий два интерфейса. У этих интерфейсов есть метод по умолчанию с одинаковыми именем и сигнатурой.
Теперь один и тот же метод по умолчанию с одной и той же сигнатурой унаследован от двух разных интерфейсов. У каждого интерфейса своя реализация этого метода.
Итак, как наш класс узнает, какую из двух различных реализаций использовать?
Он и не узнает. Приведенный выше код приведет к ошибке компиляции. Если вам требуется заставить его работать, то для этого необходимо переопределить конфликтный метод в вашем классе.
Приватные методы
С появлением Java 8 и введением методов по умолчанию и статических методов, у интерфейсов появилась возможность содержать не только сигнатуры методов, но и их реализации. При написании таких реализаций рекомендуется разделять сложные методы на более простые. Такой код легче переиспользовать, поддерживать и понимать.
Для такой цели вы бы использовали приватные методы, поскольку они могут содержать все детали реализации, которые не должны быть видимы и использованы извне.
К сожалению в Java 8 интерфейс не может содержать приватные методы. Это означает, что вы можете использовать:
Собеседование по Java — ООП (вопросы и ответы). Часть 1.
Вопросы и ответы по теме ООП (объектно ориентированное программирование) для собеседования по Java.
К списку вопросов по всем темам
Список всех вопросов по ООП
1. Назовите принципы ООП и расскажите о каждом.
2. Дайте определение понятию “класс”.
3. Что такое поле/атрибут класса?
4. Как правильно организовать доступ к полям класса?
5. Дайте определение понятию “конструктор”.
6. Чем отличаются конструкторы по умолчанию, копирования и конструктор с параметрами?
7. Какие модификации уровня доступа вы знаете, расскажите про каждый из них.
8. Расскажите об особенностях класса с единственным закрытым (private) конструктором.
9. О чем говорят ключевые слова “this”, “super”, где и как их можно использовать?
10. Дайте определение понятию “метод”.
11. Что такое сигнатура метода?
12. Какие методы называются перегруженными?
13. Могут ли нестатические методы перегрузить статические?
14. Расскажите про переопределение методов.
15. Может ли метод принимать разное количество параметров (аргументы переменной длины)?
16. Можно ли сузить уровень доступа/тип возвращаемого значения при переопределении метода?
17. Как получить доступ к переопределенным методам родительского класса?
18. Какие преобразования называются нисходящими и восходящими?
19. Чем отличается переопределение от перегрузки?
20. Где можно инициализировать статические/нестатические поля?
21. Зачем нужен оператор instanceof?
22. Зачем нужны и какие бывают блоки инициализации?
23. Каков порядок вызова конструкторов и блоков инициализации двух классов: потомка и его предка?
24. Где и для чего используется модификатор abstract?
25. Можно ли объявить метод абстрактным и статическим одновременно?
26. Что означает ключевое слово static?
27. К каким конструкциям Java применим модификатор static?
28. Что будет, если в static блоке кода возникнет исключительная ситуация?
29. Можно ли перегрузить static метод?
30. Что такое статический класс, какие особенности его использования?
31. Какие особенности инициализации final static переменных?
32. Как влияет модификатор static на класс/метод/поле?
33. О чем говорит ключевое слово final?
34. Дайте определение понятию “интерфейс”.
35. Какие модификаторы по умолчанию имеют поля и методы интерфейсов?
36. Почему нельзя объявить метод интерфейса с модификатором final или static?
37. Какие типы классов бывают в java (вложенные… и.т.д.)
38. Какие особенности создания вложенных классов: простых и статических.
39. Что вы знаете о вложенных классах, зачем они используются? Классификация, варианты использования, о нарушении инкапсуляции.
40. В чем разница вложенных и внутренних классов?
41. Какие классы называются анонимными?
42. Каким образом из вложенного класса получить доступ к полю внешнего класса?
43. Каким образом можно обратиться к локальной переменной метода из анонимного класса, объявленного в теле этого метода? Есть ли какие-нибудь ограничения для такой переменной?
44. Как связан любой пользовательский класс с классом Object?
45. Расскажите про каждый из методов класса Object.
46. Что такое метод equals(). Чем он отличается от операции ==.
47. Если вы хотите переопределить equals(), какие условия должны удовлетворяться для переопределенного метода?
48. Если equals() переопределен, есть ли какие-либо другие методы, которые следует переопределить?
49. В чем особенность работы методов hashCode и equals? Каким образом реализованы методы hashCode и equals в классе Object? Какие правила и соглашения существуют для реализации этих методов? Когда они применяются?
50. Какой метод возвращает строковое представление объекта?
51. Что будет, если переопределить equals не переопределяя hashCode? Какие могут возникнуть проблемы?
52. Есть ли какие-либо рекомендации о том, какие поля следует использовать при подсчете hashCode?
53. Как вы думаете, будут ли какие-то проблемы, если у объекта, который используется в качестве ключа в hashMap изменится поле, которое участвует в определении hashCode?
54. Чем отличается абстрактный класс от интерфейса, в каких случаях что вы будете использовать?
55. Можно ли получить доступ к private переменным класса и если да, то каким образом?
56. Что такое volatile и transient? Для чего и в каких случаях можно было бы использовать default?
57. Расширение модификаторов при наследовании, переопределение и сокрытие методов. Если у класса-родителя есть метод, объявленный как private, может ли наследник расширить его видимость? А если protected? А сузить видимость?
58. Имеет ли смысл объявлять метод private final?
59. Какие особенности инициализации final переменных?
60. Что будет, если единственный конструктор класса объявлен как final?
61. Что такое finalize? Зачем он нужен? Что Вы можете рассказать о сборщике мусора и алгоритмах его работы.
62. Почему метод clone объявлен как protected? Что необходимо для реализации клонирования?
Ответы. Часть 1
1. Назовите принципы ООП и расскажите о каждом.
Объе́ктно-ориенти́рованное программи́рование (ООП) — это методология программирования, основанная на представлении программы в виде совокупности объектов, каждый из которых является экземпляром определенного класса, а классы образуют иерархию наследования.
Основные принципы ООП: абстракция, инкапсуляция, наследование, полиморфизм.
Абстракция — означает выделение значимой информации и исключение из рассмотрения незначимой. С точки зрения программирования это правильное разделение программы на объекты. Абстракция позволяет отобрать главные характеристики и опустить второстепенные.
Пример: описание должностей в компании. Здесь название должности значимая информация, а описание обязанностей у каждой должности это второстепенная информация. К примеру главной характеристикой для «директор» будет то, что это должность чем-то управляет, а чем именно (директор по персоналу, финансовый директор, исполнительный директор) это уже второстепенная информация.
Инкапсуляция — свойство системы, позволяющее объединить данные и методы, работающие с ними, в классе. Для Java корректно будет говорить, что инкапсуляция это «сокрытие реализации». Пример из жизни — пульт от телевизора. Мы нажимаем кнопочку «увеличить громкость» и она увеличивается, но в этот момент происходят десятки процессов, которые скрыты от нас. Для Java: можно создать класс с 10 методами, например вычисляющие площадь сложной фигуры, но сделать из них 9 private. 10й метод будет называться «вычислитьПлощадь()» и объявлен public, а в нем уже будут вызываться необходимые скрытые от пользователя методы. Именно его и будет вызывать пользователь.
Наследование — свойство системы, позволяющее описать новый класс на основе уже существующего с частично или полностью заимствующейся функциональностью. Класс, от которого производится наследование, называется базовым, родительским или суперклассом. Новый класс — потомком, наследником, дочерним или производным классом.
Полиморфизм — свойство системы использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта. Пример (чуть переделанный) из Thinking in Java:
Связывание задач
Связывание задач (Issue linking) позволяет создать связь между двумя существующими задачами на одном или разных серверах JIRA. Например:
- Задача может относиться к другой задаче.
- Задача может дублировать другую задачу.
- Задача может заблокировать другую задачу.
(Ваш администратор JIRA может настраивать типы связей, которые вам потребуется создать.)
Связывание задач также позволяет:
- Создать связь между задачей JIRA и страницей Confluence.
- Связать задачу JIRA с любой другой веб-страницей.
Связи задачи в пределах задачи выглядят следующим образом:
Скриншот: раздел «Связи задачи» (Issue Links) в пределах задачи

Примечание: Решенные задачи (то есть задачи с установленной резолюцией) отображаются зачеркнутым шрифтом, например, DEMO-1.
Создание связи между задачами, находящимися на одном и том же сайте JIRA
Для того, чтобы создать связь между задачами, находящимися на одном и том же сайте JIRA, необходимо выполнить следующие шаги:
1. Откройте задачу, которую вы хотите связать с другой задачей на том же сайте JIRA.
2. Выберите «Дополнительно» (More)> «Связь» (Link), чтобы отобразить диалоговое окно «Связь» (Link).
Комбинация клавиш ‘.’ + Начать вводить ссылку

3. Убедитесь, что элемент «Задача JIRA» (JIRA Issue) выбран в левой части диалогового окна, а затем выберите тип связи из раскрывающегося списка «Эта задача» (This issue).
Если ваш системный администратор JIRA настроил полностью взаимные связи приложений между сайтом JIRA и другим сервером, выпадающий список «Сервер» (Server) может появиться над списком «Эта задача» (This issue). Если это так, убедитесь, что ваш сайт JIRA появился или был выбран из списка серверов.
4. В поле «Задачa» (Issue) укажите задачу(и), связанную с вашей просматриваемой / выбранной задачей. Есть два способа сделать это:
- Введите полный ключ задачи (например, ABC-123) — или для связи с несколькими задачами нажимайте клавишу «Ввод» (Enter) между каждым введенным ключом задачи.
Если вы ранее просматривали задачу, вы можете быстро найти эту задачу, введя первые несколько букв ключа задачи (или часть резюме), которые будут отображаться в раскрывающемся списке «автозаполнение» для выбора.
ИЛИ:
- Нажмите ссылку «поиск задачи» (search for an issue), чтобы использовать всплывающее окно «Найти задачи JIRA» (Find JIRA issues), которое позволяет выполнять простой текстовый поиск или расширенный поиск задач.
5. Необязательно: добавьте комментарий (Comment), чтобы описать, почему вы связываете эти задачи.
6. Нажмите кнопку «Связь» (Link) в нижней части диалогового окна.
Создание связи между задачами, находящимися на разных сайтах JIRA
Чтобы создать этот тип связи, системный администратор JIRA должен был настроить полностью взаимные связи приложений между сайтом JIRA и другим сайтом JIRA, содержащим задачи, с которыми вы хотите установить связь.
Эта функция недоступна в Облаке Atlassian
Для того, чтобы создать связь между задачами, находящимися на разных сайтах JIRA, выполните следующие шаги:
1. Откройте задачу, которую вы хотите связать с другой задачей.
2. Выберите «Дополнительно» (More)> «Связь» (Link), чтобы отобразить диалоговое окно «Связь» (Link).
комбинация клавиш: ‘.’ + Начать вводить ссылку
3. Убедитесь, что элемент «Задача JIRA» (JIRA Issue) выбран в левой части диалогового окна.
Примечание:
- Этот опция недоступна, если системный администратор JIRA не настроил связь на приложение между сайтом JIRA и удаленным сайтом JIRA.
- Если после выбора этой опции вам будет предложена авторизация, вас могут попросить войти в систему на удаленном сайте JIRA, что позволит сайту JIRA получать доступ к удаленному сайту JIRA от имени вашей учетной записи на удаленном сайте JIRA.
Это поведение означает, что связки на приложения, настроенные между вашим сайтом JIRA и удаленным сайтом JIRA, используют аутентификацию OAuth.
4. Если ваш сайт JIRA подключен к нескольким удаленным сайтам JIRA, выберите соответствующий сайт JIRA из раскрывающегося списка «Сервер» (Server).
5. Выберите тип связи из раскрывающегося списка «Эта задача» (This issue).
6. Введите в поле «Задача» (Issue) ключ задачи, находящейся на удаленном сайте JIRA, на которую вы хотите установить ссылку. Кроме того, вы можете искать задачи, находящиеся на удаленном сайте JIRA, нажав на ссылку «поиск задачи» (search for an issue), которая открывает всплывающее окно «Найти задачи JIRA» (Find JIRA issues).
Вы можете ссылаться на любую задачу на удаленном сайте JIRA, к которой у вас есть доступ на этом сайте.
7. Установите флажок «Создать взаимную связь» (Create reciprocal link), чтобы создать дополнительную связь на удаленную задачу, на которую вы ссылаетесь, назад к вашей задаче. Например, если вы создаете тип связи блоков для удаленной задачи, то обратная связь, сгенерированная при удаленной задаче, будет заблокирована по типу связи обратно к вашей локальной задаче.
8. Необязательно: добавьте комментарий (Comment), чтобы описать, почему вы связываете эти задачи.
9. Нажмите кнопку «Связь» (Link) в нижней части диалогового окна.
Исправление проблем
Проблема: Если вы выбрали флажок «Создать взаимную связь» (Create reciprocal link), но после нажатия кнопки «Связь» (Link) выяснилось, что обратная связь с удаленной задачи JIRA на вашу задачу JIRA не была создана. Скорее всего, ваш системный администратор JIRA создал только одностороннюю связь с вашего сайта JIRA на удаленный сайт JIRA.
Решение: Попросите администратора системы JIRA полностью настроить взаимные связи приложений между сайтом JIRA и удаленным сайтом JIRA.
Проблема: Допустим, вы попытались создать обратную связь, но получили следующее сообщение:
«Взаимная связь задачи « XYZ-123 » с этой задачей не была создана, так как удаленный сервер JIRA возвратил следующую ошибку: No Link Issue Permission (Нет разрешения связи на задачу) для задачи« XYZ-123 ». (Где «XYZ-123» является ключом к задаче на удаленном сайте JIRA),
потому что взаимная связь на удаленном сайте JIRA не будет создана, так как учетная запись пользователя, с помощью которой вы прошли аутентификацию на удаленном сайте JIRA (см. выше: шаг 3), не имеет разрешения проекта «Связывание задач».
Решение (Solution):
- Попросите администратора (-ов) проекта JIRA на удаленном сайте JIRA предоставить вашей учетной записи пользователя проектное разрешение «Связывание задач» (Link Issues) для соответствующих проектов, для которых вам необходимо создать связи между задачами.
- В качестве альтернативы, если связь приложения между сайтом JIRA и удаленным сайтом JIRA использует аутентификацию OAuth и вы подозреваете, что вы можете пройти аутентификацию на удаленном сайте с другой учетной записью пользователя, которая не имеет проектного разрешения «Связывание задач» (Link Issues), повторите описанную выше процедуру, но в течение авторизации (на шаге 3), выполните аутентификацию на удаленном сайте с учетной записью пользователя, которая имеет это разрешение.
Если вы не запрашиваете аутентификацию во время авторизации, сначала попробуйте очистить файлы cookie браузера и повторите процедуру еще раз.
Создание связи со страницей Confluence
Чтобы создать этот тип ссылки, системному администратору JIRA необходимо настроить ссылку приложения между сайтом JIRA и сайтом Confluence, содержащим страницы, на которые вы хотите установить ссылку.
Для того, чтобы создать связь со страницей Confluence, выполните следующие шаги:
1. Откройте задачу, которую вы хотите связать с другой задачей.
2. Выберите «Дополнительно» (More)> > (Link), чтобы отобразить диалоговое окно «Связь» (Link).
Комбинация клавиш: ‘.’ + Начать вводить ссылку (Link)
3. Нажмите опцию «страница Confluence» (Confluence Page) в левой части диалогового окна.
Этот опция недоступна, если системный администратор JIRA не настроил связь на приложение между сайтом JIRA и сайтом Confluence.
4. Если между сайтом JIRA и другими сайтами Confluence настроено несколько связей на приложения, выберите подходящий сайт Confluence из выпадающего списка «Сервер» (Server).
5. Укажите страницу Confluence, которая будет связана с вашей просматриваемой задачей. Есть два способа сделать это:
- В поле URL- адрес страницы введите URL- адрес страницы (Page URL) сайта Confluence, с которой вы хотите установить связь. Например:
- Нажмите ссылку «Поиск страницы» (search for a page). Диалоговое окно «Ссылка» (Link) заменится на диалоговое окно «Найти страницу Confluence » (Find a Confluence page).
Если вам будет предложено получить авторизацию, вам может потребоваться войти на сайт Confluence, который позволит вашему сайту JIRA получить доступ к сайту Confluence от имени вашей учетной записи на сайте Confluence.
Это поведение означает, что связь на приложения, настроенные между вашим сайтом JIRA и удаленным сайтом Confluence, используют аутентификацию OAuth.
- В первом поле поиска (Search) укажите одно или несколько условий поиска, которые отображаются на странице, с которой вы хотите установить связь. Это поле является обязательным.
- Необязательно: во втором поле поиска (Search) выберите пространство Confluence для дальнейшего сужения поиска.
- Нажмите кнопку «Поиск»(Search), а затем заголовок страницы, с которой вы хотите установить связь.
6. Необязательно: добавьте комментарий (Comment), чтобы описать, почему вы связываете эти задачи.
7. Нажмите кнопку «Связь» (Link) в нижней части диалогового окна.
Исправление проблем
. Проблема: Если связь со страницей Confluence, которую вы создаете, показывает: «Не удалось загрузить задачу JIRA» или, если вы попытались найти страницу Confluence, но получили следующее сообщение:
«Не удалось получить доступ к контенту на сайте Confluence, потому что функция «Удаленный API» сервера Confluence отключена». Системный администратор Confluence должен включить эту функцию «Удаленный API» для успешного доступа JIRA к этому контенту».
в результате JIRA не смогла связаться с сервером Confluence:
- Получить информацию о связи или
- Выполните поиск страницы Confluence в диалоговом окне «Найти страницу Confluence» (Find a Confluence page)
Решение:
Попросите администратора системы Confluence включить функцию удаленного API (XML- RPC и SOAP) (Remote API (XML-RPC & SOAP), поскольку эта функция Confluence по умолчанию отключена. Подробнее см. «Включение удаленного API» в документации Confluence.
Создание связи с любой URL веб-страницей
Для того, чтобы создать связь с любой URL веб-страницей, выполните следующие шаги:
1. Откройте задачу, которую вы хотите связать с другой задачей.
2. Выберите «Дополнительно» (More)>«Связь» (Link), чтобы отобразить диалоговое окно «Связь» (Link).
Комбинация клавиш: ‘.’ + Начать вводить ссылку (Link)
3. Нажмите опцию «Веб-связь» (Web Link) в левой части диалогового окна.
4. Укажите URL- адрес веб-страницы, с которой вы хотите установить связь.
5. Укажите текст связи (Link Text), который будет отображаться в разделе «Связи задачи» (Issue Links) на странице «Просмотр задачи» (View Issue) и будет связан с гиперссылкой на ваш URL-адрес.
6. Необязательно: добавьте комментарий (Comment), чтобы описать, почему вы связываете эти задачи.
7. Нажмите кнопку «Связь» (Link) в нижней части диалогового окна.
Удаление связи
Для того, чтобы удалить связь с задачей в пределах задачи, выполните следующие шаги:
- Перейдите к задаче, содержащую связи, и найдите раздел «Связи задачи» (Issue Links) (см. скриншот выше).
- Наведите указатель мыши на связь, которую вы хотите удалить, и нажмите значок «Удалить» (Delete) (мусорная корзина).
Поиск связанных задач
Вы можете искать задачи, связанные с конкретной задачей. Для получения дополнительной информации, см. документацию по расширенному поиску.
Помните, что эта функция не распространяется на задачи на удаленном сервере JIRA.