Ho un sacco di costanti nel mio codice per varie proprietà regolabili del mio sistema. Li sto spostando tutti in un file centrale .properties
. La mia soluzione attuale è quella di avere un unico Properties.java
che carica staticamente il file .properties
ed espone vari metodi getter come questo:Iniezione di costanti tramite annotazione personalizzata
public class Properties {
private static final String FILE_NAME = "myfile.properties";
private static final java.util.Properties props;
static {
InputStream in = Properties.class.getClassLoader().getResourceAsStream(
FILE_NAME);
props = new java.util.Properties();
try {
props.load(in);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public static String getString(Class<?> cls, String key) {
return props.getProperty(cls.getName() + '.' + key);
}
public static int getInteger(Class<?> cls, String key) {
return Integer.parseInt(getString(cls, key));
}
public static double getDouble(Class<?> cls, String key) {
return Double.parseDouble(getString(cls, key));
}
}
L'unico problema di questo è che per ogni costante che ricevo da questo file, ho un po ' boilerplate:
private final static int MY_CONSTANT = Properties.getInteger(
ThisClass.class, "MY_CONSTANT");
non credo che voglio usare primavera o simili che sembra ancora più boilerplae. Speravo di usare un'annotazione personalizzata per risolvere il problema. Ho trovato this tutorial, ma non riesco davvero a capire come ottenere la funzionalità che desidero dall'elaborazione dell'annotazione. I documenti Java erano ancora meno utili. Questa dovrebbe essere una cosa che dovrei essere in grado di fare in fase di compilazione, però. Conosco i nomi della classe e del campo.
Quello che sto pensando è qualcosa di simile:
@MyAnnotation
private static final int MY_CONSTANT;
Qualcuno sa come vorrei andare a fare questo o almeno le migliori pratiche per quello che voglio fare?
Perché pensi che i suoi carichi di codice piastra caldaia? non aggiungerebbe l'annotazione? – SMA
Sono davvero costanti? O più come oggetti di configurazione? Se sono configurati, è davvero necessario scriverli come costanti? Perché il modificatore di 'final' perderebbe il suo significato (non sono nemmeno sicuro che la riflessione possa assegnare un valore a un campo' finale'). Se sono solo di configurazione, anche, perché non dovresti usare un framework di configurazione per facilitare il tuo compito (come [commons-configuration] (https://commons.apache.org/proper/commons-configuration/) o [typesafe's config] (https://github.com/typesafehub/config))? Se sono costanti, perché la necessità di essere in grado di "modificarle" ad ogni esecuzione? –
Inoltre, non si chiude 'InputStream' nel blocco' try-catch-finally'. Dovresti provare a farlo. –