2015-12-14 4 views
6

Alcuni non-così-attenti miei colleghi sono state passando intorno Optional istanze e assumendo è sicuro di chiamare get su di loro senza chiamare isPresent prima.Come arrivare IntelliJ per mettere in guardia circa gli usi pericolosi di Optional.get()

Lo so ... questo non dovrebbe accadere, ma il sistema di tipi non li fermerà !!

Quindi, volevo che IntelliJ lo facesse. È possibile configurare IntelliJ in modo che avvisi (o addirittura genera un errore di compilazione) sulla chiamata Optional.get() senza prima chiamare Optional.isPresent()?

+0

È un po 'pesante, ma è possibile scrivere il proprio controllo e installarlo tramite un plug-in? Probabilmente un approccio più semplice ... ma il caso peggiore ... – vikingsteve

+1

Intendi davvero che ti aspetti che tutti chiamino prima "Optional.isPresent()"? Questa non è la mia comprensione dell'intenzione di "Optional". Se è così, è solo come dover ricordare di fare un controllo nullo, quindi non hai guadagnato nulla. Ad esempio, per quanto riguarda gli usi di 'Optional.map()' - in tal caso l'ispezione lo identificherà come un problema, ma potrebbe essere perfettamente sicuro, senza aver prima chiamato 'isPresent()'. – DaveyDaveDave

+1

Voglio dire che 'get()' deve essere chiamato dopo un controllo con 'isPresent()'. Non ho detto nulla su 'map()' o altri metodi. – Renato

risposta

2

IntelliJ 2016.1 supporta questo out-of-the-box!

Per impostazione predefinita, chiamando get() senza verificare con isPresent() prima emetterà un avvertimento, ma si può andare alla schermata "Ispezioni" e impostare Optiong.get() without isPresent() check per avere gravità "errore", se si preferisce.

0

È possibile utilizzare un'ispezione per contrassegnare le istanze e visualizzare un avviso/errore. Questo potrebbe essere esclusivo per il massimo.

Per aggiungere un controllo su ordinazione, seguire https://www.jetbrains.com/idea/help/creating-custom-inspections.html, o fare questo:

  1. Aprire le impostazioni (CTRL + ALT + S) e la ricerca di ispezioni.
  2. Nella struttura, trovare "Generale" e sotto "Ispezione ricerca strutturale".
  3. Sotto la descrizione viene visualizzato il pannello Gravità/Opzioni. Accanto alle opzioni, premere + e aggiungere un modello di ricerca.

Per configurare l'ispezione alla tua domanda:

  1. Nella casella di modello di ricerca, aggiungere una variabile seguita da una chiamata di metodo, come ad esempio: $ grado $ .get()
  2. fare clic su Modifica variabili e selezionare $ Istanza $ dall'elenco.
  3. Nei "Vincoli di espressione", aggiungere il tipo di espressione "Opzionale" e applicare il vincolo all'interno della gerarchia dei tipi.

Salvare le modifiche ed eseguire l'ispezione. (CTRL + Maiusc + Alt + I, digitare "Ispezione ricerca strutturale"). Questo dovrebbe mostrare tutte le istanze di Optional.get().

Modifica: Nella domanda si chiede se è possibile ottenere un errore di compilazione. Credo che questo dipenderà strettamente da come stai costruendo il tuo codice. Se aggiungi un'ispezione e imposta il livello di errore su "Errore", dovrebbe fallire su Crea/Compila ma non su "installazione mvn".

+0

Non penso che questo in realtà risponda alla domanda. La domanda è chiedere un'ispezione che identifichi gli usi di 'Optional.get()' dove lo sviluppatore non ha precedentemente controllato se l'opzione non è vuota. Questa ispezione identificherà solo tutti gli usi di 'Optional.get()', che non è di grande aiuto. – DaveyDaveDave

+1

Punto giusto. Sono stato troppo preso dal trovare le istanze dell'ottenere che ho perso di vista la domanda. Credo che in IntelliJ vi siano ispezioni che seguono lo stesso schema che l'OP vuole, ma non so se è possibile crearlo utilizzando il creatore di ispezione in-editor, potrebbe essere necessario creare un plugin come suggerito da @vikingsteve. – Creperum

Problemi correlati