Comprensione metodi get e set

di il
21 risposte

21 Risposte - Pagina 2

  • Re: Comprensione metodi get e set

    maracaibo25 ha scritto:


    si tutto,forma,convenzioni e cosa si scrive dentro
    La forma in generale è:
    private Tipo nomeProprieta;
    
    public Tipo getNomeProprieta() {
        return nomeProprieta;
    }
    
    public void setNomeProprieta(Tipo nomeProprieta) {
        this.nomeProprieta = nomeProprieta;
    }
    • I metodi sono generalmente public. In alcuni casi potrebbero essere protected se servono solo alle sottoclassi (e non a chiunque) ma è uno scenario più raro e da vedere caso per caso.
    • Tipo può essere un qualunque tipo (primitivo/reference) e deve corrispondere tra getter e setter.
    • Se la proprietà è un boolean è lecito usare isNomeProprieta invece di getNomeProprieta.
    • Il setter deve essere void.
    • Il nome della proprietà dedotto dai metodi dalle librerie/tool che usano la introspezione (reflection) è nomeProprietà (n minuscolo!!) non NomeProprieta, ovvero viene preso il nome del metodo, tolto set/get e poi decapitalizzato.
    • Il nome del campo (la variabile di istanza) NON necessariamente deve chiamarsi esattamente come il nome della proprietà ma generalmente si fa così.
    • Il nome del parametro tipicamente si mette uguale al nome del campo (per non "inventarsi" un altro nome del parametro) e si usa this per qualificare il campo. È uno scenario di shadowing (il nome del parametro "nasconde" il nome del campo) ma è ormai assodato/accettato nella programmazione Java.
    -------------

    Se fai una classe Persona:
    public class Persona {
        private String nome;
        private int annoNascita;
    
        public String getNome() {
            return nome;
        }
        
        public void setNome(String nome) {
            this.nome = nome;
        }
        
        public int getAnnoNascita() {
            return annoNascita;
        }
        
        public void setAnnoNascita(int annoNascita) {
            this.annoNascita = annoNascita;
        }
    }
    E poi crei un oggetto Persona con nome "Mario" e annoNascita 1985 e poi usi una libreria come la Jackson (per JSON), se generi un JSON dall'oggetto ottieni (qui sotto "formattato" solo per leggibilità):
    {
        "nome": "Mario",
        "annoNascita": 1985
    }
    Ovvero annoNascita è il nome della proprietà (NON il nome del campo!!!). Jackson come tante altre librerie che si basano sui java bean deduce il nome dai metodi: c'è un getAnnoNascita/setAnnoNascita allora ---> annoNascita
  • Re: Comprensione metodi get e set

    andbin ha scritto:


    Ma in Employee ce n'è un altro di errore. Guarda bene uno dei costruttori ....
    nel primo costruttore viene settato il "salary" ma non viene passato in argomento appunto al metodo costruttore
  • Re: Comprensione metodi get e set

    maracaibo25 ha scritto:


    nel primo costruttore viene settato il "salary" ma non viene passato in argomento appunto al metodo costruttore
    Il primo costruttore NON riceve il salary ma fa un setSalary(2000); ovvero imposta un "default". E questo è GIUSTO.

    No, guarda l'altro .....
  • Re: Comprensione metodi get e set

    andbin ha scritto:


    La forma in generale è:
    private Tipo nomeProprieta;
    
    public Tipo getNomeProprieta() {
        return nomeProprieta;
    }
    
    public void setNomeProprieta(Tipo nomeProprieta) {
        this.nomeProprieta = nomeProprieta;
    }
    • I metodi sono generalmente public. In alcuni casi potrebbero essere protected se servono solo alle sottoclassi (e non a chiunque) ma è uno scenario più raro e da vedere caso per caso.
    • Tipo può essere un qualunque tipo (primitivo/reference) e deve corrispondere tra getter e setter.
    • Se la proprietà è un boolean è lecito usare isNomeProprieta invece di getNomeProprieta.
    • Il setter deve essere void.
    • Il nome della proprietà dedotto dai metodi dalle librerie/tool che usano la introspezione (reflection) è nomeProprietà (n minuscolo!!) non NomeProprieta, ovvero viene preso il nome del metodo, tolto set/get e poi decapitalizzato.
    • Il nome del campo (la variabile di istanza) NON necessariamente deve chiamarsi esattamente come il nome della proprietà ma generalmente si fa così.
    • Il nome del parametro tipicamente si mette uguale al nome del campo (per non "inventarsi" un altro nome del parametro) e si usa this per qualificare il campo. È uno scenario di shadowing (il nome del parametro "nasconde" il nome del campo) ma è ormai assodato/accettato nella programmazione Java.
    -------------

    Se fai una classe Persona:
    public class Persona {
        private String nome;
        private int annoNascita;
    
        public String getNome() {
            return nome;
        }
        
        public void setNome(String nome) {
            this.nome = nome;
        }
        
        public int getAnnoNascita() {
            return annoNascita;
        }
        
        public void setAnnoNascita(int annoNascita) {
            this.annoNascita = annoNascita;
        }
    }
    E poi crei un oggetto Persona con nome "Mario" e annoNascita 1985 e poi usi una libreria come la Jackson (per JSON), se generi un JSON dall'oggetto ottieni (qui sotto "formattato" solo per leggibilità):
    {
        "nome": "Mario",
        "annoNascita": 1985
    }
    Ovvero annoNascita è il nome della proprietà (NON il nome del campo!!!). Jackson come tante altre librerie che si basano sui java bean deduce il nome dai metodi: c'è un getAnnoNascita/setAnnoNascita allora ---> annoNascita
    grazie andbin
  • Re: Comprensione metodi get e set

    andbin ha scritto:


    Il primo costruttore NON riceve il salary ma fa un setSalary(2000); ovvero imposta un "default". E questo è GIUSTO.

    No, guarda l'altro .....
    l'errore sta nel "this (name, age)",credo perche il this () deve essere sempre la prima istruzione all'interno del costruttore
  • Re: Comprensione metodi get e set

    maracaibo25 ha scritto:


    l'errore sta nel "this (name, age)",credo perche il this () deve essere sempre la prima istruzione all'interno del costruttore
    Esatto, ottimo!
    La chiamata this( ..... ); oppure super( ..... ); con o senza argomenti infatti DEVE essere la prima istruzione presente in un costruttore. Se non c'è una di queste invocazioni, il compilatore inserisce un super(); senza (ovviamente) argomenti.

    Se scambi quelle due istruzioni (e idealmente con tutti i getter/setter corretti), Employee compila senza errori.
    Però quei due costruttori sono fatti in modo poco utile/sensato. Li hanno fatti così solamente per vedere se si "casca" sui concetti dei costruttori.
    In realtà per fare la cosa "buona" si doveva fare così:
    // Questo è sensato e corretto
    
        public Employee(String name, int age) {
            this(name, age, 2000);
        }
    
        public Employee(String name, int age, int salary) {
            setName(name);
            setAge(age);
            setSalary(salary);
        }
    Ovvero il costruttore completo, con tutti i dati, usa tutti i setter. Poi l'altro parziale invoca quello completo passando un default.
  • Re: Comprensione metodi get e set

    andbin ha scritto:


    Esatto, ottimo!
    La chiamata this( ..... ); oppure super( ..... ); con o senza argomenti infatti DEVE essere la prima istruzione presente in un costruttore. Se non c'è una di queste invocazioni, il compilatore inserisce un super(); senza (ovviamente) argomenti.

    Se scambi quelle due istruzioni (e idealmente con tutti i getter/setter corretti), Employee compila senza errori.
    Però quei due costruttori sono fatti in modo poco utile/sensato. Li hanno fatti così solamente per vedere se si "casca" sui concetti dei costruttori.
    In realtà per fare la cosa "buona" si doveva fare così:
    // Questo è sensato e corretto
    
        public Employee(String name, int age) {
            this(name, age, 2000);
        }
    
        public Employee(String name, int age, int salary) {
            setName(name);
            setAge(age);
            setSalary(salary);
        }
    Ovvero il costruttore completo, con tutti i dati, usa tutti i setter. Poi l'altro parziale invoca quello completo passando un default.
    Ok grazie andbin
Devi accedere o registrarti per scrivere nel forum
21 risposte