Java-enum met meerdere waardetypes

Wat ik eigenlijk heb gedaan, is een opsomming schrijven voor staten, en ik wil ze niet alleen als staten kunnen openen, maar ook toegang hebben tot hun afkorting en of ze al dan niet een originele kolonie waren.

public enum States {
        ...
        MASSACHUSETTS("Massachusetts",  "MA",   true),
        MICHIGAN("Michigan",            "MI",   false),
            ...; //so on and so forth for all fifty states
        private final Object[] values;
        States(Object... vals) {
            values = vals;
        }
        public String FULL() {
            return (String) values[0];
        }
        public String ABBR() {
            return (String) values[1];
        }
        public boolean ORIGINAL_COLONY(){
            return (boolean) values[2];
        }
    }

Dit lijkt te werken zoals ik zou verwachten. ik kan

System.out.println(States.ALABAMA);                  // Prints "ALABAMA"
System.out.println(States.ALABAMA.FULL());           // Prints "Alabama"
System.out.println(States.ALABAMA.ABBR());           // Prints "AL"
System.out.println(States.ALABAMA.ORIGINAL_COLONY());// Prints "false"

Voor dit specifieke scenario met opsommingen, is dit de beste manier om dit te doen of is er een betere manier om deze opsomming in te stellen en op te maken? Bij voorbaat dank aan iedereen!


Antwoord 1, autoriteit 100%

Ten eerste mogen de enum-methoden niet in hoofdletters zijn. Het zijn methoden, net als andere methoden, met dezelfde naamgevingsconventie.

Ten tweede, wat je doet is niet de best mogelijke manier om je opsomming in te stellen. In plaats van een reeks waarden voor de waarden te gebruiken, moet u voor elke waarde afzonderlijke variabelen gebruiken. Je kunt dan de constructor implementeren zoals je elke andere klasse zou doen.

Zo moet je het doen met alle bovenstaande suggesties:

public enum States {
    ...
    MASSACHUSETTS("Massachusetts",  "MA",   true),
    MICHIGAN     ("Michigan",       "MI",   false),
    ...; // all 50 of those
    private final String full;
    private final String abbr;
    private final boolean originalColony;
    private States(String full, String abbr, boolean originalColony) {
        this.full = full;
        this.abbr = abbr;
        this.originalColony = originalColony;
    }
    public String getFullName() {
        return full;
    }
    public String getAbbreviatedName() {
        return abbr;
    }
    public boolean isOriginalColony(){
        return originalColony;
    }
}

Other episodes