Domanda

Mi piacerebbe avere una sorta di progetto di ampio-fail meccanismo rapido (forse un RuntimeException) per qualsiasi codice che causa l'assegnazione di NaN.

Nel mio progetto NaN non è mai un valore valido.

Mi rendo conto che potrei aggiungere asserisce (utilizzando isNaN ) o di altre prove in tutto, ma voglio sapere se c'è un modo più elegante.

È stato utile?

Soluzione

Sì, è possibile utilizzare AspectJ (aspetto di programmazione orientata) per lanciare un errore ogni volta che un valore è impostato su NaN.

In sostanza, si vuole intercettare ogni volta che un valore è impostato, ed eseguire qualche altra funzione.

Abbiamo fatto cose simili nella nostra base di codice ... ma non posso dare molto aiuto al di fuori di questo.

Altri suggerimenti

No - perché NaN è un valore valido, utilizzando non causerà alcuna eccezione a essere gettati. Senza alcun meccanismi di monitoraggio onnipresenti da usare, si dovrebbe verificare in modo esplicito nei punti in cui potrebbe essere assegnato o restituito da un metodo.

se siete pronti a sacrificare la prestazioni dell'applicazione, è possibile creare un wrapper per doppia (o un altro oggetto numerico che si desidera utilizzare) e gettare eccezione quando NaN è impostato.

Tecnicamente, sarebbe possibile creare un agente per fare questo strumentazione il codice in questione per iniettare assert o se test automaticamente. Ciò comporterebbe un po 'di ispezione bytecode e trasformazione (ad esempio utilizzando ASM ). A mio parere, ci vorrebbero circostanze straordinarie per giustificare questo. Dovresti essere attenti a tutte le classi dello strumento che si basano sul fatto di poter elaborare NaN internamente.

Non sono a conoscenza che qualcuno ha scritto un tale agente. Se siete alla ricerca di una pallottola d'argento, non credo che ci sia uno.

Solo un altro approccio - si potrebbe integrare pedine codice come PMD nel vostro processo di generazione e di creare una regola che riporta ogni incarico di Double.NaN.

Non sarà perfetto, perché non può prendere Nan si ottiene dalla parte esterna (database, connessioni) o che qualcuno crea attraverso la manipolazione po ', ma almeno si può assicurare che Double.NaN non può essere assegnato ad una variabile o essere utilizzato come un parametro di metodo o all'interno una valutazione.

La definizione delle regole potrebbe essere difficile - ma almeno - è un altro approccio. La regola più semplice potrebbe essere quella di vietare Double.NaN a tutti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top