Vogliamo implementare una classe Alunno un po’ più articolata della solita classe introduttiva, dotandola di svariati metodi aggiuntivi. Il diagramma UML è di seguito riportato.

Cosa possiamo notare da questo schema? Abbiamo una serie di attributi privati, tra cui spicca una data da gestire con la classe standard messaci a disposizione da Java SDK ed una serie di 4 voti di tipo decimale. Non abbiamo riportato i metodi set e get di accesso a tali attributi, lo riteniamo scontato che debbano essere creati visto che gli IDE di sviluppo, incluso IntelliJ, li creano automaticamente con un click. Viene richiesto un costruttore vuoto, un costruttore con nome, cognome e data di nascita, un costruttore di copia. In aggiunta abbiamo un metodo che deve calcolare e restituire la media dei 4 voti inseriti, un metodo che torna il max dei voti e uno il min dei voti, due metodi che stampano le info anagrafiche ed uno che stampa i voti con max e min, un metodo che torna un booleano vero se almeno 3 voti sono maggiori o uguali a 6, un metodo più complesso, che ci deve restituire l’età anagrafica dell’alunno in base alla sua data di nascita inserita e la data attuale. Creiamo inoltre una classe Main dove testare costruttori, metodi e stampe varie.
La classe Alunno.java
Costruttori e metodi set/get non dovrebbero impaurire il lettore. I metodi di media, max e min non sono complessi per l’alunno che dovrebbe essere abituato a calcolarli con i vettori addirittura.
Nel metodo di stampa anagrafica ho aggiunto una piccola chicca String.format(“%-25s”, this.nome) + “|”); che altro non è che una funzione che stampa una stringa di lunghezza fissa con spazi vuoti a riempire per fare l’effetto grafico di una scheda. Se al lettore complica un po’ la vita, può stampare i campi in modo semplice come fatto in stampa voti. La funzione per il calcolo dell’età è molto interessante perché sfrutta il potenziale della classe LocalDate che mette a disposizione numerosi funzionalità tra cui quella di estrapolare l’anno dalla data.
import java.time.LocalDate;
public class Alunno
{
private String nome;
private String cognome;
private LocalDate datadinascita;
private String indirizzo;
private char sesso;
private double voto1;
private double voto2;
private double voto3;
private double voto4;
//COSTRUTTORI
public Alunno(){}
public Alunno(String _n, String _c, LocalDate _l)
{
this.nome = _n;
this.cognome = _c;
this.datadinascita = _l;
this.sesso = 'M';
this.indirizzo = "";
this.voto1 = -1;
this.voto2 = -1;
this.voto3 = -1;
this.voto4 = -1;
}
//costruttore di copia
public Alunno (Alunno a)
{
this.nome = a.getNome();
this.cognome = a.getCognome();
this.datadinascita = a.datadinascita;
this.sesso = a.sesso;
this.indirizzo = a.indirizzo;
this.voto1 = a.getVoto1();
this.voto2 = a.getVoto2();
this.voto3 = a.getVoto3();
this.voto4 = a.getVoto4();
}
// METODI DI ACCESSO SET/GET
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public String getCognome() {
return cognome;
}
public void setCognome(String cognome) {
this.cognome = cognome;
}
public LocalDate getDatadinascita() {
return datadinascita;
}
public void setDatadinascita(LocalDate datadinascita) {
this.datadinascita = datadinascita;
}
public String getIndirizzo() {
return indirizzo;
}
public void setIndirizzo(String indirizzo) {
this.indirizzo = indirizzo;
}
public char getSesso() {
return sesso;
}
public void setSesso(char sesso) {
this.sesso = sesso;
}
public double getVoto1() {
return voto1;
}
public void setVoto1(double voto1) {
this.voto1 = voto1;
}
public double getVoto2() {
return voto2;
}
public void setVoto2(double voto2) {
this.voto2 = voto2;
}
public double getVoto3() {
return voto3;
}
public void setVoto3(double voto3) {
this.voto3 = voto3;
}
public double getVoto4() {
return voto4;
}
public void setVoto4(double voto4) {
this.voto4 = voto4;
}
//METODI ACCESSORI
public void stampaVoti()
{
System.out.println("|-----------------------------------|");
System.out.println("| VOTI ALUNNO |");
System.out.println("|-----------------------------------|");
System.out.println("| Voto1 : " + this.voto1);
System.out.println("| Voto2 : " + this.voto2);
System.out.println("| Voto3 : " + this.voto3);
System.out.println("| Voto4 : " + this.voto4);
System.out.println("|-----------------------------------|");
}
public void stampaAnagrafica()
{
System.out.println("|-----------------------------------|");
System.out.println("| ANAGRAFICA ALUNNO |");
System.out.println("|-----------------------------------|");
System.out.println("| Nome : " + String.format("%-25s", this.nome) + "|");
System.out.println("| Cognome: " + String.format("%-25s", this.cognome) + "|");
System.out.println("| Sesso : " + String.format("%-25s", this.sesso) + "|");
System.out.println("| Data di Nascita: " + String.format("%-17s", this.datadinascita) + "|");
System.out.println("| Indirizzo: " + String.format("%-23s", this.indirizzo) + "|");
System.out.println("|-----------------------------------|");
}
public double calcolaMedia()
{
double somma = this.voto1 + this.voto2 + this.voto3 + this.voto4;
double media = somma / 4;
return media;
}
public double votoMax()
{
double votomax = 0;
if (this.voto1 > votomax)
votomax = this.voto1;
if (this.voto2 > votomax)
votomax = this.voto2;
if (this.voto3 > votomax)
votomax = this.voto3;
if (this.voto4 > votomax)
votomax = this.voto4;
return votomax;
}
public double votoMin()
{
double votomin= 11;
if (this.voto1 < votomin)
votomin = this.voto1;
if (this.voto2 < votomin)
votomin = this.voto2;
if (this.voto3 < votomin)
votomin = this.voto3;
if (this.voto4 < votomin)
votomin = this.voto4;
return votomin;
}
public boolean promosso()
{
int conta = 0;
if (this.voto1 >= 6)
conta++;
if (this.voto2 >= 6)
conta++;
if (this.voto3 >= 6)
conta++;
if (this.voto4 >= 6)
conta++;
if (conta >= 3)
return true;
return false;
}
public int eta()
{
int anni = LocalDate.now().getYear() - this.datadinascita.getYear();
return anni;
}
}
La classe Main.java
E’ giunto il momento di testare la nostra classe con tutti i suoi metodi e costruttori. Non c’è molto da commentare. Abbiamo fatto una piccola personalizzazione per stampare promosso o bocciato a seconda del ritorno vero/falso della funzione promosso().
import java.time.LocalDate;
public class Main {
public static void main(String[] args)
{
Alunno a = new Alunno();
Alunno b = new Alunno("Alfredo","Centinaro", LocalDate.of(1982,01,02));
b.setIndirizzo("via po', 12");
b.setVoto1(6);
b.setVoto2(5.50);
b.setVoto3(8.00);
b.setVoto4(7.45);
Alunno c = new Alunno(b);
b.stampaAnagrafica();
System.out.println();
b.stampaVoti();
System.out.println();
System.out.println("Voto Max: " + b.votoMax());
System.out.println("Voto min: " + b.votoMin());
System.out.println("Media Voti " + b.calcolaMedia());
if (b.promosso())
System.out.println("PROMOSSO");
else
System.out.println("BOCCIATO");
System.out.println();
System.out.println("Anni: " + b.eta());
}
}
Ultima modifica 6 Aprile 2023