Ecco un pezzo di codice che abbiamo scritto tutto:Anomalia DD e pulizia delle risorse del database: esiste una soluzione pulita?
public CustomerTO getCustomerByCustDel(final String cust, final int del) throws SQLException { final PreparedStatement query = getFetchByCustDel(); ResultSet records = null; try { query.setString(1, cust); query.setInt(2, del); records = query.executeQuery(); return this.getCustomer(records); } finally { if (records != null) { records.close(); } query.close(); } }
Se si omette il 'finalmente' a blocchi, poi si lascia le risorse del database penzoloni, che ovviamente è un potenziale problema. Tuttavia, se fai ciò che ho fatto qui - imposta il ResultSet su null al di fuori del blocco ** try **, e poi impostalo sul valore desiderato all'interno del blocco - PMD riporta un '' anomalia DD '. Nella documentazione, un'anomalia DD è descritto come segue:
DataflowAnomalyAnalysis: L'analisi del flusso di dati tiene traccia definizioni locali, non definizioni e riferimenti a variabili su percorsi diversi sui dati flow.From quelle informazioni non possono essere trovati vari problemi. [...] DD - Anomalia: viene ridefinita una variabile definita di recente. Questo è inquietante, ma non deve essere un bug.
Se si dichiara il ResultSet di fuori del blocco senza impostare un valore, è giustamente ottiene un errore di 'potrebbe non essere stato inizializzato la variabile' quando si esegue il if (record! = Null) test.
Ora, a mio parere, il mio uso qui non è un bug. Ma esiste un modo di riscrivere in modo pulito che non possa attivare l'avviso PMD? Non voglio in particolare disabilitare la regola DataFlowAnomalyAnalysis di PMD, in quanto l'identificazione delle anomalie UR e DU sarebbe effettivamente utile; ma queste anomalie DD mi fanno sospettare che potrei fare qualcosa di meglio - e, se non c'è modo migliore di farlo, ammontano a confusione (e dovrei forse vedere se posso riscrivere la regola PMD)