Impone la decisione di codifica per includere o escludere un elemento Enum in un EnumSet in fase di compilazione

1

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?

    
posta Adam 18.02.2015 - 17:03
fonte

0 risposte

Leggi altre domande sui tag