Tipo enumerativo Java

Fab996

Utente Attivo
177
5
Se ho un tipo enumerativo per rappresentare i 4 punti cardinali, come faccio se all'interno di esso voglio definire un metodo astratto per calcolare il punto cardinale opposto? E ovviamente anche l'implementazione del metodo astratto?
 

fedi98

Nuovo Utente
121
8
beh gli passi il tuo punto cardinale e lui con uno switch o con if else nidificati ti restituisce l' opposto. cosa che sarebbe uguale se la facessi esternamente alla tua enum
 
  • Mi piace
Reazioni: Fab996

Fab996

Utente Attivo
177
5
perchè vedendo le slide fa
Codice:
public enum Punti {NORD,SUD,EST,OVEST;
    NORD() {
            public Direction opposta() {
                return SUD;
            }
    },

    OVEST() {
                        public Direction opposta() {
                             return EST;
                        }
     };
    public abstract Direction opposta();
}

Però non capisco bene come si debba scrivere correttamente il codice.... (Scusa per l'indentazione)
 

fedi98

Nuovo Utente
121
8
ma una cosa del tipo:
Codice:
public Punti getOpposedPoint(Point point){
  switch(point){
    case NORD:
      return SUD;
    case OVEST:
      return EAST;
.....
  }
}

Comunque sia penso che il tuo codice messo sopra sia corretto.
 
  • Mi piace
Reazioni: Fab996

Fab996

Utente Attivo
177
5
Ti ringrazio, solo perchè mi esce "cannot find symbol" ?
Codice:
class Enum {
  
    enum Direzione {
        NORD,SUD,OVEST,EST;
        public static Direzione opposta(Direzione dir) {
            switch(dir) {
                case NORD: return SUD;
                case EST: return OVEST;
                case SUD: return NORD;
                case OVEST: return EST;
            }
        }
    }

      

    public static void main(String[] args) {
        Direzione a = Direzione.NORD;
        System.out.println(a);
        System.out.println(Direzione.SUD.ordinal());
        System.out.println(Direzione.EST.hashCode());
        System.out.println("La direzione opposta è :"+opposta(a).toString());
    }
}
 

fedi98

Nuovo Utente
121
8
Allora prima di tutto hai sbagliato il codice della funzione opposta perche devi porre un return finale oppure un default nello switch, perchè altrimenti il programma pensa che il metodo rischi di non ritornare niente.

Inoltre ti compare "cannot find symbol" perchè il metodo è proprio della enum e non della tua classe dove contieni il main: siccome hai reso il metodo static allora puoi scrivere Direzione.opposta(a)
cosi dovresti risolvere tutto
 

Fab996

Utente Attivo
177
5
Allora prima di tutto hai sbagliato il codice della funzione opposta perche devi porre un return finale oppure un default nello switch, perchè altrimenti il programma pensa che il metodo rischi di non ritornare niente.

Inoltre ti compare "cannot find symbol" perchè il metodo è proprio della enum e non della tua classe dove contieni il main: siccome hai reso il metodo static allora puoi scrivere Direzione.opposta(a)
cosi dovresti risolvere tutto
Ti ringrazio, ho risolto. Ora non capisco un'altra cosa negli enum il criterio di equivalenza è stabilito implicitamente in base all'ordinale, quindi con una enum {NORD,SUD,OVEST,EST}, e avendo un Set<Direzione> set = mappa.keyset(), ottengo tutte le chiavi della mappa, che nel mio caso sono le direzioni. Però perchè quando vado a fare un for-each sul set le direzioni non mi vengono stampate in base all'ordinale(NORD,SUD,OVEST,EST), ma in base all'ordine lessicografico(EST,NORD,OVEST,SUD)?
 

fedi98

Nuovo Utente
121
8
Sinceramente non lo so, però provo a spararla lo stessa: mi sembra che il set si comporti come una mappa (non la LinkedHashMap) che quindi non memorizza l' ordine di immissione ma gli elementi al suo interno sono ordinati secondo un suo criterio. Magari quindi il criterio con il quale essi sono ordinati rispetta proprio il lessico

però ripeto, non ne sono sicuro
 

Fab996

Utente Attivo
177
5
Sisi, il set prevede un criterio di ordinamento solo se implementata con TreeSet(), altrimenti come hashSet() basta l'override dei metodi hashCode() e equals() per non avere elementi ripetuti, però l'hashset non prevede nessun criterio di ordinamento. Però da quanto ho capito per il tipo enum il criterio di ordinamento è indotto dall'ordinale.
 

fedi98

Nuovo Utente
121
8
beh il criterio di ordinamento è proprio della classe che ordina, non della classe che è ordinata. E non è che il set non ha un criterio di ordinamento, solamente non rispetta l' immissione
 

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili