2015-12-14 5 views
6

Niektóre niezbyt staranne koledzy z kopalni zostały przechodząc wokół Optional instancje i zakładając to jest bezpieczne, aby zadzwonić get na nich bez wywoływania isPresent pierwszy.Jak zdobyć IntelliJ ostrzegać o niebezpiecznych zwyczajów Optional.get()

Wiem ... to nie powinno się zdarzyć, ale system typu nie powstrzyma ich!

Tak więc chciałem, żeby IntelliJ to zrobił. Czy możliwe jest skonfigurowanie IntelliJ tak, aby ostrzegał (a nawet zgłaszał błąd kompilacji) o wywołaniu Optional.get() bez uprzedniego wywołania Optional.isPresent()?

+0

Jest to trochę ciężkie, ale można napisać własną inspekcję i zainstalować ją za pomocą wtyczki? Prawdopodobnie łatwiejsze podejście ... ale najgorszy przypadek ... – vikingsteve

+1

Czy naprawdę myślisz, że spodziewasz się, że każdy najpierw nazwie "Opcjonalnie.isPresent()"? To nie jest moje rozumienie intencji "Opcjonalnie". Jeśli tak, to jest to tylko to, co trzeba pamiętać, aby wykonać zerową kontrolę, więc nic nie zyskałeś. Na przykład, co z zastosowaniami 'Optional.map()' - w takim przypadku twoja inspekcja zidentyfikowałaby to jako problem, ale mogłaby być całkowicie bezpieczna, bez wcześniejszego wywoływania 'isPresent()'. – DaveyDaveDave

+1

Mam na myśli, że 'get()' musi zostać wywołane po sprawdzeniu z 'isPresent()'. Nie powiedziałem nic o 'map()' ani żadnych innych metodach. – Renato

Odpowiedz

2

IntelliJ 2016.1 obsługuje to gotowe do użycia!

Domyślnie, nazywając get() bez weryfikacji z isPresent() pierwszy wyśle ​​ostrzeżenie, ale można przejść do ekranu „inspekcje” i ustawić Optiong.get() without isPresent() check mieć ważności „Error”, jeśli wolisz.

0

Można użyć inspekcji w celu oznaczenia instancji i wyświetlenia ostrzeżenia/błędu. Może to być wyłączne do ostatecznego.

Aby dodać kontrolę niestandardową, wykonaj https://www.jetbrains.com/idea/help/creating-custom-inspections.html, czy to zrobić:

  1. otworzyć ustawienia (CTRL + ALT + S) i szukać inspekcji.
  2. W drzewie znajdź "Ogólne", a pod nim "Przegląd inspekcji strukturalnej".
  3. Pod opisem zobaczysz panel ważności/opcji. Obok opcji naciśnij + i dodaj szablon wyszukiwania.

Aby skonfigurować inspekcję na pytanie:

  1. w polu wyszukiwania szablonu, dodać zmienną a następnie metodą wywołania, takich jak: $ Instancji $ .get()
  2. kliknij przycisk Edytuj zmienne i wybierz $ Instance $ z listy.
  3. W "Ograniczeniach wyrażeń" dodaj typ wyrażenia "Opcjonalny" i zastosuj wiązanie w hierarchii typów.

Zapisz zmiany i przeprowadź inspekcję. (CTRL + Shift + Alt + I, wpisz "Inspekcja wyszukiwania strukturalnego"). Powinno to pokazać wszystkie instancje Optional.get().

Edytuj: W pytaniu pytasz, czy można uzyskać błąd kompilacji. Wierzę, że będzie to ściśle zależało od tego, jak budujesz swój kod. Jeśli dodasz inspekcję i ustawisz poziom błędu na "Błąd", powinien on zawieść w Make/Compile, ale nie w "instalacji mvn".

+0

Nie sądzę, że to faktycznie odpowiada na pytanie. Pytanie dotyczy inspekcji, która identyfikuje zastosowania 'Optional.get()', w której programista nie sprawdził wcześniej, czy Opcjonalne nie jest puste. Ta inspekcja pokaże wszystkie zastosowania 'Opcjonalnie.get()', co nie jest zbyt pomocne. – DaveyDaveDave

+1

Punkt targów. Za bardzo pochwycił mnie przypadek, że straciłem z oczu to pytanie. Wierzę, że są kontrole w IntelliJ, które są zgodne z tym samym wzorem, który OP chce, ale nie wiem, czy można to zrobić za pomocą kreatora inspekcji w edytorze, może trzeba utworzyć wtyczkę, jak sugerował @vikingsteve. – Creperum

Powiązane problemy