Vorrei far sì che gli elementi di un Enum Java siano scelti o esclusi da un EnumSet in fase di compilazione
vale a dire. Sono costretto a prendere la decisione di metterlo nel set o no ogni volta che creo un nuovo elemento per il mio Enum.
vale a dire. un nuovo elemento sull'Enum non verrà compilato a meno che non venga aggiunto o escluso deliberatamente.
Pensavo di essere molto intelligente rendendo la scelta dipendente da un parametro costruttore come questo (l'ultimo parametro):
public enum MyFileType {
DOT_CSV("csv", "text/csv", true),
DOT_XLS("xls", "application/vnd.ms-excel", true),
DOT_XLSX("xlsx", "application/vnd.ms-excel", true),
UNRECOGNISED(null, null, false);
/** Makes sure TYPES is initialised first. */
private static class AllowedFileTypes {
private static final Set<MyFileType> TYPES =
EnumSet.noneOf(MyFileType.class);
}
public final String fileExtension;
private final String mailContentType;
private MyFileType(final String newExtension,
final String newMailContentType,
final boolean allowed) {
fileExtension = newExtension;
if (allowed) {
AllowedFileTypes.TYPES.add(this);
}
}
}
Pensavo di essere molto intelligente perché eccezionalmente per le classi, quando la classe Enum è inizializzata, i costruttori vengono chiamati prima in modo che Enum abbia elementi, e solo allora i campi statici vengono inizializzati.
Ciò significava che non potevo semplicemente avere un campo statico con un EnumSet per i miei "tipi consentiti".
Mettere il campo TYPES in una classe statica lo batte - la classe statica inizializza per prima.
Quindi in teoria ho pensato che sarebbe stato possibile aggiungere l'elemento nel set AllowedTypes. Tuttavia c'è un grosso problema: EnumSet può essere istanziato solo da una chiamata a uno dei suoi metodi di fabbrica, ei metodi di fabbrica vogliono vedere tutti gli elementi.
Quindi in fase di esecuzione, a questo punto l'Enum non viene inizializzato, non ha ancora elementi e EnumSet decide che non può essere un Enum e lancia una ClassCastException.
Tecnicamente penso che dovrebbe gettare alcune variazioni di IllegalStateException, ma questo è oltre il punto.
Pertanto, non posso utilizzare questo approccio per inizializzare il mio Enumer di AllowedTypes. Potrei ricorrere all'utilizzo di una percentuale diretta diHashSet
e inizializzarla su richiesta, ma in realtà non è elegante.
In quale altro modo posso raggiungere il mio obiettivo?