Upload
sonia-bernardini
View
224
Download
2
Tags:
Embed Size (px)
Citation preview
Esempio: Tombola!Parte seconda
Publisher - Subscriber
package tombola;public interface Publisher { public void subscribe(Object sender); public void unsubscribe(Object sender); public void notifyAll(Object x);}------------------------------------------------------------package tombola;public interface Subscriber { public void getNotification(Object x); }
Banco
package tombola; import java.util.*;
public class Banco implements Publisher { Random generatore; Set numeriUsciti; final int MAXNUM = 9; Collection subscriberSet;
public Banco() { generatore = new
Random(System.currentTimeMillis()/101); numeriUsciti = new HashSet(); subscriberSet = new HashSet(); }
Banco
int getNextNumber() { boolean isNew = false; int num = 0; do { num = generatore.nextInt(MAXNUM) + 1; isNew = numeriUsciti.add(new Integer(num));
} while (!isNew); System.out.println("==> Estratto il
numero:"+num); notifyAll(new Integer(num)); return num; }
Banco
public void subscribe(Object x) { subscriberSet.add(x); } public void unsubscribe(Object x) { subscriberSet.remove(x); } public void notifyAll(Object x){ Iterator i=subscriberSet.iterator(); while (i.hasNext()) { ((Subscriber)i.next()).getNotification(x); } } public static void main(String[] args) { Banco banco1 = new Banco(); banco1.test(); }
} // end of class
Player
package tombola;import java.util.*;
public class Player implements Subscriber { Collection cartella; Collection cartellaOriginale; final int MAXNUM=9; final int NCELLS=3; String nome=null;
Player(String nome){this.nome=nome;}
Player
void creaNuovaCartella(int k){ Random generatore = new
Random(System.currentTimeMillis()*k);
cartella=new HashSet(); for (int i=1; i<=NCELLS; i++) { boolean creatoNuovoNumero=false; do { int x=generatore.nextInt(MAXNUM)+1; creatoNuovoNumero=cartella.add(new Integer(x)); } while (!creatoNuovoNumero); } cartellaOriginale=new TreeSet(); cartellaOriginale.addAll(cartella); mostraCartella(); }
Player
public boolean checkNumber(int x) { boolean presente=cartella.remove(new Integer(x)); if (presente) { System.out.println(nome+" ha il numero "+x); } return presente; }
public boolean hasFinished() { if (cartella.isEmpty()) { System.out.println(nome+" ha finito!"); System.out.println("Aveva la seguente cartella:"); mostraCartella(); return true; } else return false;}
Player
public void mostraCartella(){ Iterator iter=cartellaOriginale.iterator(); while (iter.hasNext()) { System.out.print(iter.next()+" "); } System.out.println(nome);}
public void getNotification(Object x) { checkNumber(((Integer)x).intValue()); if (hasFinished()) System.exit(0); }
Gioco
public class Gioco { final int NUMPLAYERS=10; public Gioco() { Banco b1=new Banco(); Player p[]=new Player[NUMPLAYERS]; for (int i=0;i<NUMPLAYERS;i++){ p[i] = new Player("Pippo" + i); p[i].creaNuovaCartella(i); b1.subscribe(p[i]); } while (true) { b1.getNextNumber(); } } public static void main(String[] args) { Gioco gioco1 = new Gioco(); }}
Gioco2 6 7 Pippo02 7 8 Pippo11 5 6 Pippo22 4 7 Pippo35 6 8 Pippo43 4 6 Pippo54 5 7 Pippo66 7 8 Pippo73 4 7 Pippo81 2 5 Pippo9==> Estratto il numero:4Pippo3 ha il numero 4Pippo6 ha il numero 4Pippo5 ha il numero 4Pippo8 ha il numero 4==> Estratto il numero:2Pippo3 ha il numero 2Pippo1 ha il numero 2
Pippo9 ha il numero 2Pippo0 ha il numero 2==> Estratto il numero:5Pippo4 ha il numero 5Pippo2 ha il numero 5Pippo6 ha il numero 5Pippo9 ha il numero 5==> Estratto il numero:6Pippo4 ha il numero 6Pippo2 ha il numero 6Pippo5 ha il numero 6Pippo0 ha il numero 6Pippo7 ha il numero 6==> Estratto il numero:1Pippo2 ha il numero 1Pippo2 ha finito!Aveva la seguente cartella:1 5 6 Pippo2
Fondamenti di Java
Static
Modificatori: static
Variabili e metodi associati ad una
Classe anziche’ ad un Oggetto
sono definiti “static”.
Le variabili statiche servono come
singola variabile condivisa tra le varie istanze
I metodi possono essere richiamati senza creare una istanza.
Variabili “static”: esempio 1class S { static int instanceCount = 0; //variabile “di classe” S() {instanceCount++;}
}public class A { public static void main(String a[]) { new A(); } A() { for (int i = 0; i < 10; ++i) { S instance=new S(); } System.out.println("# of instances: "+S.instanceCount); }}
Output:# of instances: 10
Variabili “static”: esempio 2class S { static int instanceCount = 0; //variabile “di classe” S() {instanceCount++;} public void finalize() {instanceCount--;}}public class A { public static void main(String a[]) { new A();}
A() { for (int i = 0; i < 10; ++i) { S instance=new S(); } System.out.println("# of instances: "+S.instanceCount); System.gc(); System.runFinalization(); System.out.println("# of instances: "+S.instanceCount); }}
Output:# of instances: 10# of instances: 0
Metodi “static”: esempio 1class S { static int instanceCount = 0; //variabile “di classe” S() {instanceCount++;} static void azzeraContatore() {instanceCount=0;}}public class A { public static void main(String a[]) { new A(); } A() { for (int i = 0; i < 10; ++i) { if (i%4==0) S.azzeraContatore(); S instance=new S(); } System.out.println("instanceCount: "+S.instanceCount); }}
Output:instanceCount: 2
Può agire solo su variabili statiche!
Ruolo: Metodi che agiscono suvariabili statiche
metodi “static”: esempio 2
Math.sqrt(double x);System.gc();System.arrayCopy(...);System.exit();Integer.parseInt(String s);Float.parseFloat(String s);
Notare la maiuscola!
(per convenzione)
Che cos’e’:System.out.println() ?
Ruolo:analogo alle librerie del C
Perchè il main è “static”?public class A { String s="hello"; public static void main(String a[]) { System.out.println(s); }}
Non static variable s cannot be referenced from static context
public class A { String s="hello"; public static void main(String a[]) { new A; } A() { System.out.println(s); }}
hello
Input/Output, Eccezioni
Lettura di stringheimport java.io.*;
public class A {
public A() {
BufferedReader s = new BufferedReader(
new InputStreamReader(System.in));
try {
System.out.println("Dammi una stringa");
String str=s.readLine();
System.out.println("Hai scritto "+str);
}catch (IOException e){
e.printStackTrace();
}
}
public static void main(String [] ar) {
A a=new A(); }
}
Dammi una stringaabracadabraHai scritto abracadabra
Lettura di intpublic A() {
int i=0;
BufferedReader s = new BufferedReader(
new InputStreamReader(System.in));
try {
System.out.println("Dammi un intero");
i=Integer.parseInt(s.readLine());
System.out.println("Hai scritto "+i);
}catch (Exception e) {e.printStackTrace();}
}
Dammi un intero2Hai scritto 2
Lettura di intpublic A() {
int i=0;
BufferedReader s = new BufferedReader(
new InputStreamReader(System.in));
try {
System.out.println("Dammi un intero");
i=Integer.parseInt(s.readLine());
System.out.println("Hai scritto "+i);
}catch (IOException e) {e.printStackTrace();}
}Dammi un interopippojava.lang.NumberFormatException: For input string: "gh"at
java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)at java.lang.Integer.parseInt(Integer.java:426)at java.lang.Integer.valueOf(Integer.java:532)at pila.A.<init>(A.java:11)at pila.A.main(A.java:19)
Exception in thread "main"
Lettura di floatpublic A() {
float f=0; boolean error;
BufferedReader s = new BufferedReader(
new InputStreamReader(System.in));
try {
do {
System.out.println("Dammi un float");
try{
error=false;
f=Float.parseFloat(s.readLine());
} catch (NumberFormatException e) {
error=true;
System.out.println("Input non valido");
}
} while (error);
System.out.println("Hai scritto "+f);
}catch (IOException e) {e.printStackTrace();}
}
Dammi un floatpippoInput non validoDammi un float3Hai scritto 3.0
Lettura di stringhe con GUI
import javax.swing.JOptionPane;public A() {
... String input = JOptionPane.showInputDialog(
"How are you?");
System.out.println(input);
System.exit(1);
}
Essenziale!Altrimenti la thread che
gestisce la GUI rimane viva, e il processo non termina