Visualizzazione dei risultati da 1 a 10 su 17

Discussione: Creazione tipo enum

Hybrid View

  1. #1
    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?
    Ultima modifica di matteom96; 18-01-2017 a 19:32

  2. #2
    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

  3. #3
    Scusa la mia ignoranza,ho scritto la mia soluzione ,quasi identica alla tua,pensando di non aver ricevuto risposta e invece la tua era sulla seconda pagina del forum,di cui non sapevo l'esistenza

    Comunque

    "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."

    Come si potrebbe fare?

    Sono molto poco pratico di forum

  4. #4
    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
    ho scritto la mia soluzione ,quasi identica alla tua
    Beh sì, perché alla fine il concetto è quello.

    Quote Originariamente inviata da matteom96 Visualizza il messaggio
    "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."

    Come si potrebbe fare?
    Una cosa che forse non hai ancora appreso del tutto è che le enum diventano delle "classi" (detto in generale) molto particolari e ricevono un trattamento speciale.
    Quando tu definisci una enum, il compilatore inserisce una serie di metodi impliciti, alcuni li ho già citati ( name() e valueOf() ). Ma ce n'è un altro: values(). Questo è un metodo static che restituisce un array di tutti gli oggetti (delle costanti) definiti per la enum.

    Nel mio FasciaOraria il compilatore inserisce un metodo:

    public static FasciaOraria[] values()

    Quindi nel metodo che io ho suggerito trovaPerCodice puoi usare questo values() ... prova un po' ad immaginare come (?).
    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.