Costantini Diego 107724 04/05/2001 Esercitazione del 26/04/2001 Programmi di esempio Java: contatori e utilizzo di package Le classi utilizzate sono state Example e Counter, il primo come componente software e il secondo come template. Sono stati compilati ed eseguiti quattro tipi di esercizi, ognuno con e senza l’uso di package (per esempio nella cartella “ex1” è stato utilizzato il package ex1, mentre in quella “ex1a” è stato omesso). L’unica differenza che comporta l’utilizzo del package riguarda la compilazione e l’esecuzione, che devono essere lanciate dalla cartella immediatamente superiore a quella del package (“javac ex1\Counter.java” e “javac ex1\Example.java” per la compilazione, e “java ex1.Example” per l’esecuzione). E’ fondamentale ricordarsi di lanciare dalla posizione esatta tali comandi, ed è altrettanto fondamentale ricordarsi che Java è case sensitive, e quindi necessita di un uso corretto delle maiuscole/minuscole. In questi esempi sono presenti anche commenti (parti del programma inclusi tra /* e */) che possono facilmente documentare il programma eseguendo il comando javadoc. Esercizio1: ex1 Counter.java package ex1; /** * * A Counter is an object that counts integer values. * It provides services to be reset, * to be incremented and to retrieve its value * * @author Pippo Baudo * @version 1.0 */ public class Counter { /** * Resets the counter value. * * The value is reset to zero. */ public void reset(){ value=0; } /** * Increments the counter value. */ public void inc(){ value++; } /** * Gets the counter value. */ public int getValue(){ return value; } // private data private int value; } Le funzioni svolte da questa classe oggetto sono: reset(), che riporta il contatore al valore prestabilito, in questo caso 0; inc(), che incrementa il valore del contatore, in questo caso di 1; getValue(), che restituisce il valore attuale del contatore. Example.java package ex1; /** * Example application explaining * the use of Counter object */ public class Example { public static void main (String args[]) { Counter c= new Counter(); c.reset(); c.inc(); c.inc(); System.out.println(c.getValue()); } } Questo componente software, invece, definisce, tramite il costruttore Counter(), un riferimento “c” all’oggetto contatore, dopodiché lo resetta e lo incrementa 2 volte; infine stampa a video il valore del contatore in quel momento, che nel nostro esempio è 2. In entrambi i sorgenti, “package ex1” indica il package di appartenenza della classe, e semplicemente eliminando tale riga in entrambi i file si elimina la dipendenza dal package, come mostrato nei file in “ex1a”: Counter.java (ex1a) /** * * A Counter is an object that counts integer values. * It provides services to be reset, * to be incremented and to retrieve its value * * @author Pippo Baudo * @version 1.0 */ public class Counter { /** * Resets the counter value. * * The value is reset to zero. */ public void reset(){ value=0; } /** * Increments the counter value. */ public void inc(){ value++; } /** * Gets the counter value. */ public int getValue(){ return value; } // private data private int value; } Example.java (ex1a) /** * Example application explaining * the use of Counter object */ public class Example { public static void main (String args[]) { Counter c= new Counter(); c.reset(); c.inc(); c.inc(); System.out.println(c.getValue()); } } (d’ora in poi non considererò più la presenza o meno dei package). Esercizio2: ex2a Example.java public class Example { public static void main (String args[]) { Counter c= new Counter(); c.reset(); c.inc(); c.inc(); System.out.println(c.getValue()); } } class Counter { public void reset(){ value=0; } public void inc(){ value++; } public int getValue(){ return value; } // private data private int value; } Questa volta l’oggetto contatore è contenuto direttamente nel componente software Example, che, una volta compilato, produrrà sia la classe Counter che quella Example (Counter.class e Example.class). Esercizio3: ex3a Counter.java /** * * A Counter is an object that counts integer values. * It provides services to be reset, * to be incremented and to retrieve its value * */ public class Counter { /** * Resets the counter value. * * The value is reset to zero. */ public void reset(){ value=0; } /** * Increments the counter value. */ public void inc(){ value++; } /** * Gets the counter value. */ public int getValue(){ return value; } /** * Tests if two counters are equal. * * Two counters are equal when they have * the same value. */ public boolean equals(Counter x){ return value==x.value; } // private data private int value; } Questa volta l’oggetto contatore è in grado di eseguire una funzione in più, cioè la comparazione tra due contatori, che restituisce un valore booleano (TRUE se hanno lo stesso valore, altrimenti FALSE). Example.java public class Example { public static void main (String args[]) { Counter c1 = new Counter(); c1.reset(); c1.inc(); System.out.println("c1 = "+c1.getValue()); Counter c2 = c1; c2.inc(); System.out.println("c1 = "+c1.getValue()); System.out.println("c2 = "+c2.getValue()); // Counter c3 = new Counter(); c3.inc(); System.out.println(c3.equals(c1)); c3.inc(); System.out.println(c3.equals(c1)); } } Il componente software, questa volta, creerà un riferimento “c1” al contatore tramite un costruttore, poi lo azzererà, lo incrementerà e stamperà il suo valore a video (1).In seguito assegnerà un altro riferimento “c2” (Counter c2=c1) e verrà ancora incrementato, poi si visualizzeranno i valori di “c1” (2) e “c2” (2). Infine verrà creato un nuovo riferimento ad un nuovo contatore, che verrà incrementato una sola volta e comparato con c1 (restituendo FALSE) ed incrementato ancora una volta e comparato di nuovo (questa volta con risultato TRUE). Esercizio4: ex4a Counter.java /** * * A Counter is an object that counts integer values. * It provides services to be reset, * to be incremented and to retrieve its value * */ public class Counter { /** * Constructs a counter with default value (1). */ public Counter(){ value=1; } /** * Constructs a counter providing a start value. */ public Counter(int v){ value=v; } /** * Resets the counter value. * * The value is reset to zero. */ public void reset(){ value=0; } /** * Increments the counter value. */ public void inc(){ value++; } /** * Increments the counter value. * * @param n amount of the increment */ public void inc(int n){ value+=n; } /** * Gets the counter value. */ public int getValue(){ return value; } /** * Tests if two counters are equal. * * Two counters are equal when they have * the same value. */ public boolean equals(Counter x){ return value==x.value; } // private data private int value; } Ora l’oggetto da la possibilità di essere incrementato di un valore n, e il suo valore iniziale di default, se non specificato diversamente, sarà 1. Example.java public class Example { public static void main (String args[]) { Counter c1 = new Counter(); c1.inc(); Counter c2 = new Counter(10); c2.inc(); System.out.println("c1 = "+c1.getValue()); System.out.println("c2 = "+c2.getValue()); } } Ora si ha un riferimento ad un contatore con valore iniziale di default (1) che viene incrementato ed un altro riferimento ad un contatore con valore iniziale 10 anch’esso incrementato (entrambi gli incrementi sono unitari); infine vengono visualizzati i valori dei contatori, rispettivamente pari a 2 e 11. Esercizio aggiuntivo: exmio Counter.java Mantenuto uguale al precedente. Example.java public class Example { public static void main (String args[]) { Counter c1 = new Counter(); c1.inc(3); c1.inc(5); c1.inc(3); Counter c2 = new Counter(9); c2.inc(); c2.inc(); c2.inc(); System.out.println("c1 = "+c1.getValue()); System.out.println("c2 = "+c2.getValue()); } } Questa volta si ha un valore finale uguale a 12 per entrambi i contatori grazie a valori iniziali diversi ma anche ad incrementi diversi.