Costruttori in Java

  • Il Forum di Tom's Hardware, la più grande community dedicata all'Hardware e all'Informatica. Iscriviti Ora!
#1
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:
429
265
Hardware Utente
CPU
Intel i7 6700HQ, 2.60Ghz, 4 core 8 threads
Scheda Madre
Asustek
Hard Disk
Hitachi 7200 rpm, 1TB
RAM
16GB DDR4 (2 slot su 4)
Scheda Video
Nvidia Geforce GTX 960M, 4GB
Scheda Audio
Realtek
Sistema Operativo
Windows 10 64bit
#2
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.
 
#3
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: Akrilix
#4
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: DispatchCode
2,886
652
Hardware Utente
CPU
Intel i5-6600K @4.6 GHz
Dissipatore
Cryorig H5
Scheda Madre
ASRock Z170 Extreme 6
Hard Disk
WesternDigital 1TB & Crucial MX200 250GB
RAM
Corsair Ven 16GB DDR4 2133MHz
Scheda Video
Sapphire RX 580 Nitro+
Monitor
Dell S2418H
Alimentatore
RM550X
Case
NZXT S340
Periferiche
Cooler Master XT; Razer Abyssus
Sistema Operativo
Windows 10 Pro
#5
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: Akrilix
429
265
Hardware Utente
CPU
Intel i7 6700HQ, 2.60Ghz, 4 core 8 threads
Scheda Madre
Asustek
Hard Disk
Hitachi 7200 rpm, 1TB
RAM
16GB DDR4 (2 slot su 4)
Scheda Video
Nvidia Geforce GTX 960M, 4GB
Scheda Audio
Realtek
Sistema Operativo
Windows 10 64bit
#7
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: Akrilix

Discussioni Simili