2015-12-14 2 views
6

Некоторые не столь тщательные моих коллег были огибают Optional экземпляров и предполагающих это безопасно вызвать get на них без вызова isPresent первого.Как получить IntelliJ предупредить об опасных использованиях Optional.get()

Я знаю ... этого не должно произойти, но система типов не остановит их!

Итак, я хотел, чтобы IntelliJ сделал это. Можно ли настроить IntelliJ так, чтобы он предупреждал (или даже бросал компиляционную ошибку) о вызове Optional.get() без первого вызова Optional.isPresent()?

+0

Это тяжелый вид, но вы можете написать свой собственный осмотр и установить его через плагин? Вероятно, более простой подход ... но худший случай ... – vikingsteve

+1

Вы действительно имеете в виду, что вы ожидаете, что каждый сначала вызовет 'Optional.isPresent()'? Это не мое понимание намерения «Факультативный». Если это так, это то же самое, что нужно помнить, чтобы выполнить нулевую проверку, так что вы ничего не получили. Например, как насчет использования 'Optional.map()' - в этом случае ваша проверка будет идентифицировать его как проблему, но она может быть абсолютно безопасной, не назвав сначала 'isPresent()'. – DaveyDaveDave

+1

Я имею в виду, что 'get()' должен вызываться после проверки с 'isPresent()'. Я ничего не говорил о 'map()' или других методах. – Renato

ответ

2

IntelliJ 2016.1 поддерживает этот готовый продукт!

По умолчанию вызов get() без проверки с isPresent() первым выдаст предупреждение, но вы можете перейти к экрану «Проверки» и установите Optiong.get() without isPresent() check иметь серьезности «Ошибка», если вы предпочитаете.

0

Вы можете использовать инспекцию для экземпляра флага и показать вам предупреждение/ошибку. Это может быть исключительным.

Чтобы добавить пользовательскую проверку, выполните https://www.jetbrains.com/idea/help/creating-custom-inspections.html, или сделать это:

  1. Открыть настройки (CTRL + ALT + S) и поиск осмотров.
  2. В дереве найдите «Общие» и под ним «Инспекция структурного поиска».
  3. Под описанием вы увидите панель строгости/параметров. Рядом с параметрами нажмите + и добавьте шаблон поиска.

Чтобы настроить проверку на ваш вопрос:

  1. В поле поиска шаблона, добавить переменную с последующим вызовом метода, например: $ Instance $ .get()
  2. Нажмите редактировать переменные и выберите $ Instance $ из списка.
  3. В «Ограничениях выражений» добавьте тип выражения «Необязательно» и примените ограничение в иерархии типов.

Сохраните изменения и выполните осмотр. (CTRL + Shift + Alt + I, тип «Проверка структурного поиска»). Это должно показать вам все экземпляры Optional.get().

Редактировать: В вашем вопросе вы спрашиваете, возможно ли получить ошибку компиляции. Я считаю, что это будет строго зависеть от того, как вы строите свой код. Если вы добавили проверку и установили уровень ошибки на «Ошибка», она должна завершиться неудачей в Make/Compile, но не на «mvn install».

+0

Я не думаю, что это на самом деле отвечает на вопрос. Вопрос заключается в просьбе об инспекции, которая идентифицирует использование 'Optional.get()', где разработчик ранее не проверял, не является ли опция необязательной. Эта проверка будет просто идентифицировать все применения 'Optional.get()', что не очень полезно. – DaveyDaveDave

+1

Справедливая точка. Я слишком увлекся поисками примеров, которые я потерял из виду. Я считаю, что есть инспекции в IntelliJ, которые следуют той же схеме, что хочет OP, но я не знаю, можно ли создать это с помощью создателя инспектора в редакторе, возможно, потребуется создать плагин, как предлагал @vikingsteve. – Creperum

Смежные вопросы