Costruttori in Java

Akrilix

Nuovo Utente
145
32
Salve a tutti,
Sto imparando Java e ora sono ai Costruttori, ma credo di non aver capito bene a cosa servono:
In pratica i Costruttori sono un metodo (nel senso di modo) di inserimento quando si hanno molte Variabili?

Posto qui un Programmino (Stampa il Nome, E-mail e il Limite Conto di un Conto Bancario) da me fatto per capire i Costruttori:

Main:
Java:
import java.util.Scanner;

public class Main { //APERTURA DELLA CLASSE 'MAIN'
 
    public static void main (String [] args) { //APERTURA DEL MAIN
     
     
        Conto contoBancario = new Conto (); //COSTRUTTORE CON VALORI DI DEFAULT
     
        Conto contoBancario2 = new Conto ("FABIO", "FABIO@EMAIL.COM", 15000); //COSTRUTTORE CON PARAMETRI PASSATI DAL MAIN
     
        Scanner inputVariabili = new Scanner (System.in); //METODO DI INPUT
     
        boolean controlloVariabili;
        long  limiteCredito=0;
         
        System.out.print ("INSERISCI IL NUMERO DI LIMITE CREDITO: ");
     
        do {
         
            controlloVariabili = inputVariabili.hasNextInt (); //CONTROLLO PER INDIVIDUARE CARATTERI NON CONSENTITI NEL NUMERO
         
            if(controlloVariabili) { //RAMO IF: L'UTENTE NON HA INSERITO CARATTERI NON CONSENTITI NEL NUMERO
             
                limiteCredito = inputVariabili.nextInt ();
             
                if(limiteCredito < 1) { //RAMO IF: IL VALORE DELLA VARIABILE E' MINORE DI 1
                 
                    System.out.print ("ERRORE!!! INSERISCI UN VALORE MAGGIORE DI 0: ");
                 
                    continue;
                 
                }
             
                Conto contoBancario3 = new Conto ("FABIO", limiteCredito); //COSTRUTTORE CON UN PARAMETRO PASSATO DAL MAIN, UNO DALL'UTENTE E UNO DI DEFAULT
             
            }
         
            else { //RAMO ELSE: L'UTENTE HA INSERITO CARATTERI NON CONSENTITI NEL NUMERO
             
                inputVariabili.nextLine ();
             
                System.out.print ("ERRORE!!! HAI INSERITO UN CARATTERE NON CONSENTITO: ");
             
            }
         
        } while (limiteCredito < 1); //CICLO DO-WHILE: SE IL VALORE DELLA VARIABILE E' MINORE DI 1 RIESEGUE L'INPUT
     
        inputVariabili.close ();
     
    }
 
}

Conto
Java:
public class Conto { //APERTURA DELLA CLASSE 'CONTO'
 
    private String nome = "", indirizzoEmail = ""; //DICHIARAZIONE VARIABILE DI TIPO STRING
    private long limiteCredito = 0; //DICHIARAZIONE VARIABILE DI TIPO LONG
 
    public Conto () { //APERTURA DEL COSTRUTTORE N° 1 CON TUTTI I PARAMETRI DI DEFAULT
     
        this ("DEFAULT", "DEFAULT@EMAIL.COM", 99999); //VALORI DI DEFAULT
     
    }
 
    public Conto (String nome, String indirizzoEmail, long limiteCredito) { //APERTURA DEL COSTRUTTORE N° 2 PER RICEVERE I 3 PARAMETRI DAL MAIN
     
        this.nome = nome;
        this.indirizzoEmail = indirizzoEmail;
        this.limiteCredito = limiteCredito;
     
        System.out.println ("L'UTENTE " +this.nome +" CON INDIRIZZO E-MAIL " +this.indirizzoEmail +" HA UN LIMITE CREDITO DI: " +this.limiteCredito +" Euro");
     
    }
 
    public Conto (String nome, long limiteCredito) { //APERTURA DEL COSTRUTTORE N° 3 PER RICEVERE 2 PARAMETRI E DEFINIRNE 1 DI DEFAULT;
     
        this (nome, "DEFAULT@EMAIL.COM", limiteCredito); //VALORE DI DEFAULT
             
    }
 
}

Alcune domande:
1 - L'Indentazione e gli Spazi vanno bene?
2 - I Commenti fanno capire il Codice?
3 - Come faccio a utilizzare l'Input dentro un Costruttore che utilizza anche valori di Default?
 
Ultima modifica:

DispatchCode

Moderatore
Staff Forum
1,352
992
CPU
Intel 1200 I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10Gb DDR6
Audio
Integrata 7.1 HD audio
Monitor
AOC C27g2u 165Hz
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
30Mbps/3Mbps con Eolo
OS
Windows 10 64bit
Ogni volta che crei un oggetto stai richiamando il costruttore della classe; se non definisci costruttori c'è quello di default (senza parametri).
Il costruttore serve a dare un valore alle variabili di istanza (o variabili della classe, non so come sei abituato a chiamarle): in pratica l'oggetto creato avrà come valori delle sue variabili quelli specificati.

Arrivando alle altre domande:
1) io normalmente indento con 4 spazi (settando l'IDE o l'editor in modo tale che il Tap sia = 4 spazi); non ci sono vere e proprie linee guida, ma solitamente sono 2 o 4 spazi
2) i commenti sono troppi secondo me: si dovrebbe commentare multiriga prima del metodo, così da spiegare cosa fa, e nel corpo solo dove serve
3) il valore lo passi al costruttore (quindi lo leggi prima di creare l'oggetto), non leggi l'input dal suo interno.
 
  • Mi piace
Reazioni: Akrilix e BAT

BAT

Moderatore
Staff Forum
Utente Èlite
9,609
4,130
CPU
Neurone solitario
Dissipatore
Ventaglio azionato a mano
Scheda Madre
Casalinga
RAM
Molto molto volatile
GPU
Binoculare integrata nel cranio
PSU
Pastasciutta, pollo e patatine al forno
Net
Segnali di fumo e/o tamburi
OS
Windows 10000 BUG
Piccoli commenti:
- i costruttori NON sono metodi
- il continue dovresti metterlo fuori dal corpo dell'if

Il costruttore senza parametri, così come l'hai scritto non ve bene (anche se a occhio funziona):
è molto meglio NON richiamare il costruttore a 3 parametri col this, invece scrivi esplicitamente le 3 istruzioni di inizializzazione, ossia
Java:
public Conto () {
    nome = "DEFAULT"; // non c'e' bisogno di scrivere this.nome
    indirizzoEmail = "DEFAULT@EMAIL.COM";
    limiteCredito = 99999;
}
in ogni caso non mi piace, non è necessario definire un costruttore vuoto ma, se proprio vuoi, a questo punto meglio definirlo "vuoto" per davvero (ciè non deve fare niente):
Java:
public Conto () {
}
il che ha un senso:
definirlo in questo modo ti crea un oggetto con nome/email null e limite credito 0, occupa meno memoria ed è meno ambiguo di un oggetto creato con stringhe standard; ma se sei sicuro che non avrai mai bisogno di scrivere new Conto(), allora è meglio non definirlo affatto
 
Ultima modifica:
  • Mi piace
Reazioni: Akrilix

Akrilix

Nuovo Utente
145
32
Grazie mille @DispatchCode,
Volevo chiederti un'altra cosa:
Ho visto in un altro 3D che i nomi delle variabili, metodi, classi... Li scrivi in unglese. Lo fai per abitudine o perché richiesto dalle aziende?

Grazie mille anche a te @BAT00cent,
so che i costruttori non sono metodi, ho corretto anche nel messaggio principale, mentre per il continue se lo mettessi fuori dall'if mi salterebbe la parte di codice sempre anziché solo quando l'utente sbaglia ad inserire valore.

Per i costruttori invece era solo un semplice esercizio per capire come funzionano in base ai diversi metodi di input: utente, main e default (quindi senza input). Non capisco però perché hai scritto che non sia necessario il this e il this.nomeVariabile. Il primo non serve per dare valori di default? Il secondo invece per passare valori alle variabili nella classe?

Grazie mille ancora a entrambi.
 
  • Mi piace
Reazioni: DispatchCode

_Achille

Utente Èlite
3,064
722
CPU
Intel i5-6600K @4.6 GHz
Dissipatore
Cryorig H5
Scheda Madre
ASRock Z170 Extreme 6
HDD
WesternDigital 1TB & Crucial MX200 250GB
RAM
Corsair Ven 16GB DDR4 2133MHz
GPU
Sapphire RX 580 Nitro+
Monitor
Dell S2418H
PSU
RM550X
Case
NZXT S340
Periferiche
Anne Pro 2, Razer Abyssus
OS
Windows 10 Pro
Grazie mille @DispatchCode,
Volevo chiederti un'altra cosa:
Ho visto in un altro 3D che i nomi delle variabili, metodi, classi... Li scrivi in unglese. Lo fai per abitudine o perché richiesto dalle aziende?

Grazie mille anche a te @BAT00cent,
so che i costruttori non sono metodi, ho corretto anche nel messaggio principale, mentre per il continue se lo mettessi fuori dall'if mi salterebbe la parte di codice sempre anziché solo quando l'utente sbaglia ad inserire valore.

Per i costruttori invece era solo un semplice esercizio per capire come funzionano in base ai diversi metodi di input: utente, main e default (quindi senza input). Non capisco però perché hai scritto che non sia necessario il this e il this.nomeVariabile. Il primo non serve per dare valori di default? Il secondo invece per passare valori alle variabili nella classe?

Grazie mille ancora a entrambi.
Quando scrivi this(...); stai chiamando un altro costruttore che accetti quei parametri.
Quando scrivi this.nomeVariabile è perché hai un parametro omonimo, o comunque vuoi ben mostrare che nomeVariabile è variabile membro della classe.
 
  • Mi piace
Reazioni: Akrilix

Akrilix

Nuovo Utente
145
32
Quindi con this.nomeVariabile posso omettere il this se il nome della variabile nella classe è diversa da quella del metodo e i valori dei parametri verrebbero passati ugualmente nella variabile della classe?
 

DispatchCode

Moderatore
Staff Forum
1,352
992
CPU
Intel 1200 I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10Gb DDR6
Audio
Integrata 7.1 HD audio
Monitor
AOC C27g2u 165Hz
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
30Mbps/3Mbps con Eolo
OS
Windows 10 64bit
Ho visto in un altro 3D che i nomi delle variabili, metodi, classi... Li scrivi in unglese. Lo fai per abitudine o perché richiesto dalle aziende?

Il inglese è più fruibile, e se lo pubblichi hai poche alternative. A lavoro dipende molto dal progetto, a volte in inglese a volte solo in italiano.

Quindi con this.nomeVariabile posso omettere il this se il nome della variabile nella classe è diversa da quella del metodo e i valori dei parametri verrebbero passati ugualmente nella variabile della classe?

Si. Il this si riferisce all'oggetto corrente, quell'istanza corrente insomma; quindi se lo utilizzi significa che stai accedendo ad un qualche membro di quella classe. Se il parametro della funzione ha un nome diverso dalla variabile d'istanza allora non serve il this, in quanto il nome è distinto; se hanno lo stesso nome devi usarlo, altrimenti viene considerato il parametro della funzione e non la variabile d'istanza.
 
  • Mi piace
Reazioni: Akrilix

Entra

oppure Accedi utilizzando

Discussioni Simili