Durante il refactoring del codice ho inciampato su questa stranezza. Sembra impossibile controllare la proprietà strictfp per un inizializzatore senza influenzare l'intera classe. Esempio:Come rendere strictfp un blocco di inizializzazione (statico)?
public class MyClass {
public final static float[] TABLE;
strictfp static { // this obviously doesn't compile
TABLE = new float[...];
// initialize table
}
public static float[] myMethod(float[] args) {
// do something with table and args
// note this methods should *not* be strictfp
}
}
Dal JLS, Section 8.1.1.3 ho capito che l'inizializzatore sarebbe strictf se la classe sarebbe stato dichiarato utilizzando il modificatore strictf. Ma si dice anche che rende tutti i metodi implicitamente strictf:
L'effetto del modificatore strictf è quello di rendere tutti i float o doppio espressioni all'interno della dichiarazione della classe (anche all'interno inizializzatori variabili, inizializzatori esempio, inizializzatori statici, e costruttori) essere esplicitamente FP-strict (§15.4).
Ciò implica che tutti i metodi dichiarati nella classe e tutti i tipi annidati dichiarati nella classe sono implicitamente strictfp.
Quindi, il modificatore non è accettato per l'inizializzatore statico e quando viene applicato all'intera classe, tutto diventa strictfp? Dal momento che non esiste l'opposto della parola chiave strictfp, è impossibile raggiungerlo?
Quindi, sono avvitato per utilizzare un metodo statico per tenere il corpo del blocco inizializzatore per ottenere un controllo preciso su strictfp'dness?
Perché il blocco di inizializzazione chiama un metodo static strictfp un problema? –
Utilizza una classe di supporto! (Chiama il metodo helper-class nel tuo inizializzatore statico.) – EthanB
Sì. Sì. Sì. Ma non vedo un gran problema se rendi il metodo 'private'. Mentre sarebbe più bello assegnare il modificatore ai blocchi (forse con le chiusure arriverà) i metodi 'private' sono per tali implementazioni interne. Quindi "fregato" è troppo duro per me. "Forzato" lo descriverebbe meglio per me. –