7. Java: Programmazione generica Organizzazione della lezione

ASD: Sistemi Distribuiti (Prof. Scarano)
24/04/2002
7. Java: Programmazione
generica
Vittorio Scarano
Algoritmi e Strutture Dati: Sistemi Distribuiti
Corso di Laurea in Informatica
Università degli Studi di Salerno
Organizzazione della lezione
ASD: Sistemi Distribuiti. Vi.ttorio Scarano
• La classe Object: “madre” di tutte le classi
– Il metodo equals
– Il metodo toString
• Programmazione generica
–
–
–
–
La classe ArrayList
Le classi wrapper
La classe Class
Introspezione: alcuni esempi
2
1
ASD: Sistemi Distribuiti (Prof. Scarano)
24/04/2002
La classe Object
ASD: Sistemi Distribuiti. Vi.ttorio Scarano
• E’ la radice di ogni classe costruita
• In pratica ogni classe Java eredita da Object
– inutile specificarlo tramite
public class Prova extends Object {
…
}
• Rappresenta una maniera elegante per offrire servizi a
tutte le classi create dal programmatore
– e la possibilità di ridefinire questi servizi attraverso
l’override dei metodi di Object
3
Alcuni usi semplici e già visti della classe
ASD: Sistemi Distribuiti. Vi.ttorio Scarano
Object
• Una variabile Object può fare riferimento a qualsiasi
oggetto:
Object obj = new Employee (“Tizio”, 25000, 1987, 10, 1);
• Per poter usare però i metodi specifici dell’oggetto è
necessario convertirlo esplicitamente
Employee e = (Employee ) obj ;
• Servizi offerti da Object:
– metodo equals :
• permette di verificare la uguaglianza tra oggetti
– metodo toString
• permette la stampa di un oggetto
4
2
ASD: Sistemi Distribuiti (Prof. Scarano)
24/04/2002
Il metodo equals
• Obiettivi:
ASD: Sistemi Distribuiti. Vi.ttorio Scarano
– verificare se un oggetto è uguale ad un altro
• La implementazione del metodo da parte di Object:
– controlla se due oggetti puntano o meno alla stessa area di
memoria
– strategia generica (e efficace) ma che deve essere ampliata
per trattare i casi specifici della classe
• Tipicamente, del metodo viene fatto override
– definendo cosa si intende per uguaglianza nel caso specifico
5
Le specifiche del linguaggio Java per equals
(1)
• (1) il metodo deve essere riflessivo:
ASD: Sistemi Distribuiti. Vi.ttorio Scarano
– per ogni riferimento x non nullo, x.equals(x) deve restituire
true
• (2) il metodo deve essere simmetrico:
– per qualsiasi riferimento x e y, x.equals(y) deve restituire
true sse y.equals(x) restituisce true
• (3) il metodo deve essere transitivo:
– per qualsiasi riferimento x, y e z, se x.equals(y) è true e
y.equals(z) è true allora x.equals(z) restituisce true
6
3
ASD: Sistemi Distribuiti (Prof. Scarano)
24/04/2002
Le specifiche del linguaggio Java per equals
(2)
ASD: Sistemi Distribuiti. Vi.ttorio Scarano
• (4) il metodo deve essere consistente
– se gli oggetti a cui fanno riferimento x e y non sono
cambiati, allora chiamate ripetute a x.equals(y) danno sempre
lo stesso risultato
• (5) per ogni riferimento x non nullo, il metodo
x.equals(null) deve restituire false
7
L’esempio della classe Employee
ASD: Sistemi Distribuiti. Vi.ttorio Scarano
Employee.java
import java.util.*; // per Date e Calendar
public class Employee {
public Employee (String n, double s,
int year, int month, int day)
{ name = n;
salary = s;
GregorianCalendar cal =
new GregorianCalendar(year,
month-1, day);
hireDay = cal.getTime();
}
// …………………..Uno dei metodi di accesso
public String getName ()
{ return name;
}
private String name;
private double salary;
private Date hireDay;
}
• Il costruttore
– stesso nome della classe
– assegna i campi
dell’oggetto che
costruisce
• Un metodo di accesso
– restituisce il nome
• Campi della istanza
–
–
–
–
una stringa (Nome)
un double (salario)
data di assunzione
tutti campi privati
8
4
ASD: Sistemi Distribuiti (Prof. Scarano)
24/04/2002
L’esempio della classe Manager
ASD: Sistemi Distribuiti. Vi.ttorio Scarano
Manager.java
public class Manager extends Employee {
public Manager (String n, double s,
int year, int month, int day)
{ super (n, s, year, month, day);
bonus = 0;
}
// ……………………………..…Metodi acc./mod.
public double getBonus ()
{ return bonus;
}
public void setBonus(double b)
{ bonus = b; }
// …………………………….…Metodo override
public double getSalary()
{ double bs=super.getSalary();
return bs+bonus;
}
// …………………………………Variabili istanza
private double bonus;
}
• Il costruttore
– richiama il costruttore
della superclasse
– assegna il valore del
campo bonus
• Accesso/Modifica
– restituisce il bonus
– assegna il bonus
• Metodo che fa override
– il salario è la somma del
salario da impiegato e il
bonus
• Variabile istanza
9
La dipendenza tra le due classi
ASD: Sistemi Distribuiti. Vi.ttorio Scarano
Employee
- name
- salary
- hireDay
: String
: double
: Date
«constructor»
+Employee(n: String, s:double, year: int,
month: int, day: int)
«misc»
+ getName()
: String
+ getSalary()
: double
+ getHireDay()
: Date
• Qualsiasi oggetto della
sottoclasse è anche un
oggetto della
superclasse
extends
Manager
- bonus
: double
«constructor»
+Manager(n: String, s:double, year: int,
month: int, day: int)
«misc»
+ getBonus()
: double
+ setBonus(b:double)
: void
+ getSalary()
: double
10
5
ASD: Sistemi Distribuiti (Prof. Scarano)
24/04/2002
Cosa è il metodo equals per Employee?
• Deve controllare:
ASD: Sistemi Distribuiti. Vi.ttorio Scarano
– se l’oggetto passato (parametro esplicito) è null
• restituisce false (regola 5)
– se le classi dei due oggetti non corrispondono
• restituisce false
– se tutti i campi dei due oggetti sono uguali
• restituisce true
• altrimenti restituisce false
• Attenzione:
– se l’oggetto passato appartiene ad una sottoclasse il test deve
restituire false!
11
Il metodo equals della classe Employee
ASD: Sistemi Distribuiti. Vi.ttorio Scarano
Employee.java
import java.util.*; // per Date e Calendar
public class Employee {
….
public boolean equals (Object otherObj) {
// per efficienza…
if (this == otherObj) return true;
// regola 5
if (otherObj == null) return false;
// se le classi non corrispondono.. false!
if (getClass() != otherObj.getClass())
return false;
// ok, otherObj è Employee non nullo
Employee other = (Employee) otherObj;
return ( name.equals(other.name) &&
salary == other.salary
&&
hireday.equals(other.hireDay) )
}
}
• Parametri
– esplicito
– implicito (l’oggetto)
• Per ottimizzare:
– controlla se riferiscono
alla stessa locazione
– il caso più comune
• Regola 5
• Uguaglianza di classi
• Ora è possibile il
controllo effettivo sui
singoli campi
12
6
ASD: Sistemi Distribuiti (Prof. Scarano)
24/04/2002
Cosa è il metodo equals per Manager?
ASD: Sistemi Distribuiti. Vi.ttorio Scarano
• E’ una sottoclasse di Employee, quindi
– se non sono uguali “in quanto Employee” allora non sono
uguali (restituisci false)
– se risultano uguali “in quanto Employee” dobbiamo
controllare che risultino uguali anche “in quanto Manager”
(campi specifici della estensione a Manager)
• Si deve utilizzare il metodo equals della superclasse
13
Il metodo equals della classe Manager
Manager.java
ASD: Sistemi Distribuiti. Vi.ttorio Scarano
public class Manager extends Employee {
…
public boolean equals (Object otherObj) {
if (!super.equals(otherObj))
return false;
Manager other = (Manager) otherObj;
return bonus==other.bonus;
}
}
• Controlliamo se
risultano diversi in
quanto Employee
– in questo caso saranno
diversi come Manager
• Attenzione:
– il metodo della
superclasse ha anche già
controllato che this e
otherObj appartengano alla
stessa classe!
• Controllo il singolo
campo specifico
14
7
ASD: Sistemi Distribuiti (Prof. Scarano)
24/04/2002
Il metodo toString
ASD: Sistemi Distribuiti. Vi.ttorio Scarano
• Restituisce una stringa che è il “valore” dell’oggetto
• Possibile fare override del metodo fornito da Object
– che fornisce solo il nome della classe e la locazione di
memoria dove è memorizzato l’oggetto
• Convenzione utilizzata:
– il nome della classe
– seguito da tutti i valori dei campi, racchiusi tra [..]
• Esempio:
Employee e;
…
System.out.println (e);
Employee[name=“Tizio”, salary=10000, hireDay=“10 agosto 2000”]
15
Un esempio con la classe EmployeeTest
ASD: Sistemi Distribuiti. Vi.ttorio Scarano
EmployeeTest.java
import java.util.*;
public class EmployeeTest
{public static void main(String[] args)
{ Employee[] staff = new Employee[3];
staff [0]=new Employee ("Gianni",
30000,1987, 12, 10);
staff [1]=new Employee ("Giorgio",
35000, 1985, 10, 31);
staff [2]=new Manager ("Ugo",
28000, 2000, 1, 1);
for (int i=0; i< staff.length; i++)
System.out.println (
"Nome:"+ staff[i].getName() +
" Salario:" + staff[i].getSalary() +
" Assunto:"+ staff[i].getHireDay() );
for (int i=0; i< staff.length; i++)
System.out.println(staff[i]);
}
}
• Come al solito:
– riempimento dell’array
– stampa dell’array
• Utilizzo del metodo
toString
– notare che uno dei tre è
della classe Manager
16
8
ASD: Sistemi Distribuiti (Prof. Scarano)
24/04/2002
ASD: Sistemi Distribuiti. Vi.ttorio Scarano
Senza aggiungere toString a Employee
C:\>javac Employee.java Manager.java
C:\>javac EmployeeTest.java
C:\>java EmployeeTest
Nome:Gianni Salario:30000.0 Assunto:Thu Dec 10 ….
Nome:Giorgio Salario:35000.0 Assunto:Thu Oct 31 ….
Nome:Ugo Salario:28000.0 Assunto:Sat Jan 01 ….
Employee@ed645
Employee@1a698a
Manager@7077e
C:\>
Metodo toString definito in Object: nome
della classe e locazione di memoria
17
Il metodo toString della classe Employee
ASD: Sistemi Distribuiti. Vi.ttorio Scarano
Employee.java
import java.util.*; // per Date e Calendar
public class Employee {
….
public String toString () {
return getClass().getName() +
“[name=“ + name
+
“,salary=“+ salary
+
“,hireDay”=+hireDay +
“]” ;
}
}
• Stampa il nome della
classe
• Aggiunge i parametri
– la classe Date offre anche
essa un metodo toString
usato per stampare
hireDay
18
9
ASD: Sistemi Distribuiti (Prof. Scarano)
24/04/2002
Con il metodo toString a Employee
ASD: Sistemi Distribuiti. Vi.ttorio Scarano
C:\>javac Employee.java
C:\>java EmployeeTest
Nome:Gianni Salario:30000.0 Assunto:Thu Dec 10 ….
Nome:Giorgio Salario:35000.0 Assunto:Thu Oct 31 ….
Nome:Ugo Salario:28000.0 Assunto:Sat Jan 01 ….
Employee[name=Gianni,salary=30000.0,hireDay=…]
Employee[name=Giorgio,salary=35000.0,hireDay=…]
Manager[name=Ugo,salary=28000.0,hireDay…]
C:\>
Metodo toString definito in Employee:
nome della classe e valori dei campi
19
Il metodo toString della classe Manager
ASD: Sistemi Distribuiti. Vi.ttorio Scarano
Manager.java
public class Manager extends Employee {
….
public String toString () {
return getClass().getName()
+
“[name=“ + getName() +
“,salary=“ + getSalary() +
“,hireDay=“ + getHireDay() +
“,bonus=“ + bonus
+
"]" ;
}
}
• Stampa il nome della
classe
• Aggiunge i parametri
– compreso bonus
– deve necessariamente
usare i metodi di
accesso get() per
leggere i campi private
della superclasse
20
10
ASD: Sistemi Distribuiti (Prof. Scarano)
24/04/2002
Con il metodo toString a Manager
ASD: Sistemi Distribuiti. Vi.ttorio Scarano
C:\>javac Manager.java
C:\>java EmployeeTest
Nome:Gianni Salario:30000.0 Assunto:Thu Dec 10 ….
Nome:Giorgio Salario:35000.0 Assunto:Thu Oct 31 ….
Nome:Ugo Salario:28000.0 Assunto:Sat Jan 01 ….
Employee[name=Gianni,salary=30000.0,hireDay=…]
Employee[name=Giorgio,salary=35000.0,hireDay=…]
Manager[name=Ugo,salary=28000.0,hire…,bonus=0.0]
C:\>
Metodo toString definito in Employee
oppure in Manager : nome della classe e
valori dei campi
21
Organizzazione della lezione
ASD: Sistemi Distribuiti. Vi.ttorio Scarano
• La classe Object: “madre” di tutte le classi
– Il metodo equals
– Il metodo toString
• Programmazione generica
–
–
–
–
La classe ArrayList
Le classi wrapper
La classe Class
Introspezione: alcuni esempi
22
11
ASD: Sistemi Distribuiti (Prof. Scarano)
24/04/2002
ASD: Sistemi Distribuiti. Vi.ttorio Scarano
Programmazione generica
• Permessa dalla esistenza di una superclasse comune a
tutti gli oggetti e, quindi, di alcuni metodi comuni
• Un esempio:
– come scrivere un metodo che cerchi un elemento in un array
e restituisce l’indice, se trovato, oppure -1
static int find (Object [ ] a, Object key) {
for (int i=0; i < a.length; i++)
if (a[i].equals(key)) return i;
return -1;
}
– funziona con array di Employee, array di Date, array di
Stack (se implementiamo equals!)… etc.!
23
Dimensione dinamica degli array
• Importante caratteristica degli array:
ASD: Sistemi Distribuiti. Vi.ttorio Scarano
– permette il dimensionamento a run-time degli array
• Possibile (anche se in maniera complessa) in altri
linguaggi
• In Java è semplice:
int actualSize = ….;
Employee[ ] staff = new Employee[actualSize];
• Problema:
– una volta stabilita la dimensione (a run-time) è possibile
cambiarla (ingrandendo o rimpicciolendo l’array)?
24
12
ASD: Sistemi Distribuiti (Prof. Scarano)
24/04/2002
La classe ArrayList e gli array
ASD: Sistemi Distribuiti. Vi.ttorio Scarano
• Differenze:
– gli array sono parte del linguaggio Java
– la classe ArrayList è una classe di libreria del package java.util
• La classe ArrayList contiene elementi di tipo Object
– per aggiungere un elemento si usa il metodo add
• Esempio:
ArrayList staff = new ArrayList();
staff.add (new Employee(….) );
staff.add (new Employee(….) );
• Caratteristica fondamentale:
– l’ArrayList alloca automaticamente spazio se risulta
necessario
25
Alcuni metodi della classe ArrayList
• Costruttore:
ASD: Sistemi Distribuiti. Vi.ttorio Scarano
– permette di stabilire una capacità iniziale
ArrayList staff = new ArrayList(100);
• Metodo ensureCapacity()
– assicura che l’array possa contenere x elementi prima di
staff.ensureCapacity(200);
rilocarsi
• Metodo trimToSize()
staff.trimToSize();
– liberare la memoria in eccesso
• Metodo size()
for (int i = 0; i < staff.size(); i++)
– restituisce il numero di elementi presenti
26
13
ASD: Sistemi Distribuiti (Prof. Scarano)
24/04/2002
Accesso agli elementi della classe ArrayList
• La semplicità degli ArrayList comporta un prezzo:
ASD: Sistemi Distribuiti. Vi.ttorio Scarano
– l’accesso agli elementi non è semplice come per array
• Per settare l’i-mo elemento si deve usare:
staff.set (i, tizio);
– laddove se staff fosse un array avremmo usato:
staff[i] = tizio;
• Recuperare un elemento richiede un casting:
Employee e = (Employee) staff.get(i);
– infatti il metodo get restituisce un Object
27
La “pericolosità” degli ArrayList
ASD: Sistemi Distribuiti. Vi.ttorio Scarano
• Insita nella capacità di usare Object !
– non vengono effettuati controlli a tempo di compilazione
sulla consistenza ma solamente a run-time!
Date birthday = new …;
staff.set (i, birthday);
…. // continua
– in compilazione passa… ma se poi facciamo
…. //continua
Employee e = (Employee) staff.get(i);
– causiamo un errore a run-time
28
14
ASD: Sistemi Distribuiti (Prof. Scarano)
24/04/2002
Utilizzo degli elementi di ArrayList
• Attenzione: differenza tra il metodo
ASD: Sistemi Distribuiti. Vi.ttorio Scarano
staff.set (i, tizio);
– ed il metodo
staff.add (i, tizio);
– set() assegna la posizione i-ma a tizio
– add() “inserisce” tizio spostando tutti gli elementi avanti di
una posizione
• Disponibile anche:
staff.add (tizio);
– che inserisce dopo l’ultima posizione piena di staff
29
Organizzazione della lezione
ASD: Sistemi Distribuiti. Vi.ttorio Scarano
• La classe Object: “madre” di tutte le classi
– Il metodo equals
– Il metodo toString
• Programmazione generica
–
–
–
–
La classe ArrayList
Le classi wrapper
La classe Class
Introspezione: alcuni esempi
30
15
ASD: Sistemi Distribuiti (Prof. Scarano)
24/04/2002
Motivazioni alle classi wrapper
• Differenza sostanziale tra:
ASD: Sistemi Distribuiti. Vi.ttorio Scarano
– i tipi definiti (int, boolean, double, etc..)
• che fanno parte del linguaggio
– le classi
• definite dal programmatore (e quindi modificabili)
• che ereditano da Object
• Un problema:
– posso creare un ArrayList di interi?
ArrayList list = new ArrayList();
list.add(44); //Errore!
– no! è richiesto un Object e 44 è intero!
31
Le classi wrapper
ASD: Sistemi Distribuiti. Vi.ttorio Scarano
• Permettono di creare un vero e proprio oggetto
partendo da un tipo definito
– esiste una classe Integer che corrisponde a int
– esiste una classe Double che corrisponde a double, etc.
• Le classi wrapper sono final e i valori memorizzati non
possono essere modificati
– non possiamo incrementare un oggetto Integer
• A cosa servono? Innanzitutto:
ArrayList list = new ArrayList();
list.add(new Integer (44) ); //funziona!
32
16
ASD: Sistemi Distribuiti (Prof. Scarano)
24/04/2002
ASD: Sistemi Distribuiti. Vi.ttorio Scarano
Metodi di utilità delle classi wrapper
• Le classi sono la “posizione” giusta per inserire metodi
di utilità e costanti
• Conversione tra tipi di dato:
– Integer.doubleValue()
– Integer.floatValue()
– Integer.valueOf() , (converte stringa in intero) etc.
• Costanti utili:
– Integer.MIN_VALUE, Integer.MAX_VALUE
33
ASD: Sistemi Distribuiti. Vi.ttorio Scarano
Un esempio di uso
• Per usare ArrayList con double dobbiamo
necessariamente utilizzare le classi wrapper
• Questo rende l’accesso agli elementi alquanto
farraginoso:
ArrayList list = new ArrayList();
list.add(new Double (44.32) );
…
double x = ( (Double) list.get(i)).doubleValue();
• Obiettivo: creare una classe ArrayList di Double
34
17
ASD: Sistemi Distribuiti (Prof. Scarano)
24/04/2002
La classe DoubleArrayList
ASD: Sistemi Distribuiti. Vi.ttorio Scarano
DoubleArrayList.java
public class DoubleArrayList {
public DoubleArrayList {
list = new ArrayList();
}
//…………… Metodi di accesso e mod.
public void set (int n, double x) {
list.set (n, new Double (x));
}
public void add (double x) {
list.add (new Double(x));
}
public double get (int n) {
return ((Double)list.get(n)).doubleValue();
}
public int size() { return list.size();}
private ArrayList list;
}
• Costruttore:
– crea la variabile
istanza list
• Metodi di accesso:
– set:
• crea un oggetto Double
• che viene inserito in list
– get:
• preleva il valore da list
• casting in Double
• ottiene il valore come
double
• Variabile di istanza
35
Organizzazione della lezione
ASD: Sistemi Distribuiti. Vi.ttorio Scarano
• La classe Object: “madre” di tutte le classi
– Il metodo equals
– Il metodo toString
• Programmazione generica
–
–
–
–
La classe ArrayList
Le classi wrapper
La classe Class
Introspezione: alcuni esempi
36
18
ASD: Sistemi Distribuiti (Prof. Scarano)
24/04/2002
La gestione delle classi a run-tim
ASD: Sistemi Distribuiti. Vi.ttorio Scarano
• Il sistema run-time di Java mantiene per ogni oggetto
informazioni sul suo tipo (la classe)
– permette la selezione dei metodi corretti da chiamare
• Possibile utilizzare queste informazioni in un
programma Java:
– utilizzando la classe Class che contiene queste informazioni
Employee e;
….
Class cl = e.getClass();
37
La classe Class (1)
• Alcuni metodi utili: il nome di una classe
ASD: Sistemi Distribuiti. Vi.ttorio Scarano
– getName()
Employee e;
….
Class cl = e.getClass();
System.out.println (cl.getName());
– forName()
• metodo statico che permette di ottenere un oggetto Class chiamando
la classe “per nome”
String nomeClasse = “Manager”;
Class cl = Class.forName(nomeClasse);
…
38
19
ASD: Sistemi Distribuiti (Prof. Scarano)
24/04/2002
La classe Class (2)
ASD: Sistemi Distribuiti. Vi.ttorio Scarano
• Alcuni metodi utili: creazione di una istanza
– newInstance()
• crea una istanza (costruttore vuoto) della classe
Employee e;
….
Employee e2 = e.getClass().newIstance();
• crea un oggetto della stessa classe di e
– usando questo metodo possiamo creare un oggetto di una
classe indicata da una stringa
• ad esempio inserita dall’utente
String s = “Manager”;
Object m = Class.forName(s).newInstance();
…
39
Organizzazione della lezione
ASD: Sistemi Distribuiti. Vi.ttorio Scarano
• La classe Object: “madre” di tutte le classi
– Il metodo equals
– Il metodo toString
• Programmazione generica
–
–
–
–
La classe ArrayList
Le classi wrapper
La classe Class
Introspezione: alcuni esempi
40
20
ASD: Sistemi Distribuiti (Prof. Scarano)
24/04/2002
Un esempio di uso (1)
ASD: Sistemi Distribuiti. Vi.ttorio Scarano
• Obiettivi:
– costruire una classe che permetta di istanziare un oggetto di
una classe passata (come nome) al costruttore
– poter reperire informazioni sulla struttura della classe
passata
• nomi dei metodi
• nomi dei campi
• Struttura: abbiamo bisogno di
– una classe di Esempio
• un semplice contatore che può essere inizializzato, assegnato,
incrementato e decrementato
41
La classe Esempio
ASD: Sistemi Distribuiti. Vi.ttorio Scarano
Esempio.java
public class Esempio
{
public Esempio(int i)
{ num = i; }
public Esempio()
{ this (0); }
public void incrementa()
{ num++; }
public void decrementa()
{ num--; }
public int setContatore(int nuovo)
{ int old = num;
num = nuovo;
return (old);
}
public int dammiContatore()
{ return (num); }
private int num;
}
• Costruttori:
– con e senza parametro
per inizializzazione
• Metodi di modifica
– incremento
– decremento
– assegnazione
• Metodo di accesso
• Variabile di istanza
BlueJ
42
21
ASD: Sistemi Distribuiti (Prof. Scarano)
24/04/2002
La classe Loader
ASD: Sistemi Distribuiti. Vi.ttorio Scarano
Loader.java
public class Loader
{ public Loader(String n)
{ nomeClasse = n;
try {cl = java.lang.Class.forName(n);
} catch (ClassNotFoundException e) { }
try { riferimento = cl.newInstance();
} catch (Exception e) { }
}
public String dammiNomeClasse()
{ String result ="Classe: "+
nomeClasse+".";
return result;
}
public Object dammiRiferimento()
{ return riferimento; }
Class cl;
String nomeClasse;
Object riferimento;
}
• Costruttore
– assegna nomeClasse
– assegna cl
– crea una nuova
istanza e mantiene il
riferimento
• Metodi di accesso
– restituisce il nome
– restituisce riferimento
• come Object
• Variabili di istanza
BlueJ
43
La classe AdvancedLoader (1)
ASD: Sistemi Distribuiti. Vi.ttorio Scarano
AdvancedLoader.java
import java.lang.reflect.*;
public class AdvancedLoader extends Loader
{
public AdvancedLoader(String n)
{
super (n);
elencoMetodi = cl.getDeclaredMethods();
elencoCampi = cl.getDeclaredFields();
}
public void stampaMetodi()
{
System.out.println ("Metodi di "+
nomeClasse);
for (int i=0;i<elencoMetodi.length; i++){
System.out.println (" "+(i+1)+": "+
elencoMetodi[i].getName());
System.out.println (" Restituisce “ +
elencoMetodi[i].getReturnType().getName());
}
}
• Deriva da Loader
• Costruttore
– costruisce
• elenco metodi
• elenco campi
• Stampa a video i
metodi dell’oggetto
– il nome del metodo
– tipo del valore
restituito
//… continua
44
22
ASD: Sistemi Distribuiti (Prof. Scarano)
24/04/2002
La classe AdvancedLoader (2)
ASD: Sistemi Distribuiti. Vi.ttorio Scarano
AdvancedLoader.java
public void stampaCampi()
{
System.out.println ("Campi di "+
nomeClasse);
for (int i=0; i < elencoCampi.length; i++){
System.out.println (" "+(i+1)+": "+
elencoCampi[i].getName());
System.out.println (" di tipo "+
elencoCampi[i].getType().getName());
}
}
Method[ ] elencoMetodi;
Field[ ] elencoCampi;
• Stampa a video i
campi dell’oggetto
– il nome del campo
– il tipo del campo
• Variabili di istanza
}
BlueJ
45
Un metodo toString() generico
• Si può scrivere un metodo toString() generico che:
ASD: Sistemi Distribuiti. Vi.ttorio Scarano
– esamini tutti i campi dell’oggetto
• per stamparne il nome e..
• per chiamarne il corrispettivo metodo toString() per il valore
– ed esamini bottom-up tutti i campi di tutte le superclassi a
cui l’oggetto appartiene
• Una semplice gerarchia:
– una classe Prima con un intero i
– una classe Seconda che eredita da Prima e definisce un
double d
– una classe Esempio che definisce una Stringa s
46
23
ASD: Sistemi Distribuiti (Prof. Scarano)
24/04/2002
Le classi dell’esempio…
ASD: Sistemi Distribuiti. Vi.ttorio Scarano
Prima.java
Seconda.java
public class Prima
{
int i=4;
}
public class Seconda extends Prima
{
double d=3.6;
}
Esempio.java
import java.lang.reflect.*;
public class Esempio extends Seconda
{
public String toString()
{ //…. continua…
}
// variabili di istanza
String s = "Ciao";
}
47
Il metodo toString() di Esempio
ASD: Sistemi Distribuiti. Vi.ttorio Scarano
Esempio.java
public String toString()
{ Class cl = getClass();
String r = cl.getName();
do {
r+= "[";
Field[ ] f = cl.getDeclaredFields();
AccessibleObject.setAccessible(f,true);
for (int i=0;i< f.length; i++) {
r+= f[i].getName() + "=";
try { r+= f[i].get(this).toString();
} catch (Exception e) { };
if (i< f.length-1) r+=",";
}
r+= "]";
cl = cl.getSuperclass();
} while (!cl.getName().equals(
"java.lang.Object"));
return r;
}
• Preleva la classe e il
nome
• Preleva i campi
– li rende accessibili
– per ogni campo
• chiama il metodo toString
– termina i campi della
classe
– passa alla superclasse
• Fino ad arrivare a Object
BlueJ
48
24