Visualizzazione dei risultati da 1 a 10 su 17

Discussione: Creazione tipo enum

Visualizzazione discussione

  1. #11
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da matteom96 Visualizza il messaggio
    sto usando jdbc con la classe connection..come è possibile la string dall'enum java?

    comunque nel programma mi serve scrivere la fascia oraria come stringa,e non come orario... come posso rapportarla senza toppare?
    Questo è quello che si potrebbe fare:

    codice:
    public enum FasciaOraria {
        FASCIA_0830_0930("8:30-9:30"),
        FASCIA_0930_1030("9:30-10:30");
    
        private final String codiceFascia;
    
        FasciaOraria(String codiceFascia) {
            this.codiceFascia = codiceFascia;
        }
    
        public String toString() {
            return codiceFascia;
        }
    }

    Lo spiego un attimo perché magari per te è "arabo".

    I nomi delle costanti li ho messi tipo appunto FASCIA_0830_0930. Questi nomi sono tecnicamente quelli che il linguaggio Java chiama "identificatori" e devono seguire delle regole, tra cui: niente spazi, niente caratteri particolari (a parte underscore '_' e il dollaro '$' che sono leciti), NON possono iniziare con una cifra numerica.

    Gli oggetti della enum assegnati alle costanti, POSSONO avere dello "stato", è quel campo privato codiceFascia. Di norma è bene che lo stato di una enum sia "immutabile", questo è il motivo del "final" (e non c'è ovviamente alcun metodo setter).

    Il FasciaOraria(String codiceFascia) è un costruttore che è implicitamente private, Sì, le enum POSSONO avere dei costruttori interni ma sono appunto privati e non possono essere invocati esplicitamente, se non per quella forma particolare FASCIA_0830_0930("8:30-9:30") .

    E una enum può ridefinire toString(), in generale (come nell'esempio) oppure "per costante".

    Con la enum sopra, se scrivi da qualche parte:

    System.out.println(FasciaOraria.FASCIA_0830_0930);

    Ti stampa il codiceFascia, ovvero 8:30-9:30 perché viene invocato implicitamente il toString() passando l'oggetto della enum al println.

    Il vantaggio grosso delle enum è che puoi farci uno switch oppure testare l'uguaglianza con == (per riferimento). Perché gli oggetti della enum sono SOLO quelli associati alle costanti e non ce ne possono essere altri.

    Quindi se hai una variabile del tipo:

    codice:
    FasciaOraria fasciaScelta = ..........
    Puoi fare es.

    codice:
    if (fasciaScelta == FasciaOraria.FASCIA_0930_1030) {
        // .....
    }

    Una ultima questione: come passare da una stringa es. "8:30-9:30" ad avere il riferimento a FasciaOraria.FASCIA_0830_0930
    Questo purtroppo è da fare "a mano" con un pochino di codice.

    Tutte le enum hanno implicitamente un valueOf(String) che però si basa solo sul name() della enum che è il nome esatto così come è scritto nel sorgente.

    FasciaOraria fo = FasciaOraria.valueOf("FASCIA_0830_0930");

    Allora in questo caso ottieni il riferimento all'oggetto referenziato da FasciaOraria.FASCIA_0830_0930.

    NON puoi passare a valueOf il nostro codiceFascia, perché è uno "stato" che abbiamo aggiunto noi e il framework non ne sa nulla.

    Dovresti mettere in FasciaOraria un metodo statico del tipo:

    public static FasciaOraria trovaPerCodice(String codice)

    Che sfrutta o una ricerca lineare oppure (più furbamente) una mappa prepopolata che associa i codici agli oggetti.


    P.S. capisco che ho scritto un po' di roba .... se non è chiaro, chiedi!
    Ultima modifica di andbin; 18-01-2017 a 20:08
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.