24
Esempio: Tombola! Parte seconda

Esempio: Tombola! Parte seconda. Publisher - Subscriber package tombola; public interface Publisher { public void subscribe(Object sender); public void

Embed Size (px)

Citation preview

Page 1: Esempio: Tombola! Parte seconda. Publisher - Subscriber package tombola; public interface Publisher { public void subscribe(Object sender); public void

Esempio: Tombola!Parte seconda

Page 2: Esempio: Tombola! Parte seconda. Publisher - Subscriber package tombola; public interface Publisher { public void subscribe(Object sender); public void

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); }

Page 3: Esempio: Tombola! Parte seconda. Publisher - Subscriber package tombola; public interface Publisher { public void subscribe(Object sender); public void

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(); }

Page 4: Esempio: Tombola! Parte seconda. Publisher - Subscriber package tombola; public interface Publisher { public void subscribe(Object sender); public void

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; }

Page 5: Esempio: Tombola! Parte seconda. Publisher - Subscriber package tombola; public interface Publisher { public void subscribe(Object sender); public void

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

Page 6: Esempio: Tombola! Parte seconda. Publisher - Subscriber package tombola; public interface Publisher { public void subscribe(Object sender); public void

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;}

Page 7: Esempio: Tombola! Parte seconda. Publisher - Subscriber package tombola; public interface Publisher { public void subscribe(Object sender); public void

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(); }

Page 8: Esempio: Tombola! Parte seconda. Publisher - Subscriber package tombola; public interface Publisher { public void subscribe(Object sender); public void

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;}

Page 9: Esempio: Tombola! Parte seconda. Publisher - Subscriber package tombola; public interface Publisher { public void subscribe(Object sender); public void

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); }

Page 10: Esempio: Tombola! Parte seconda. Publisher - Subscriber package tombola; public interface Publisher { public void subscribe(Object sender); public void

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(); }}

Page 11: Esempio: Tombola! Parte seconda. Publisher - Subscriber package tombola; public interface Publisher { public void subscribe(Object sender); public void

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

Page 12: Esempio: Tombola! Parte seconda. Publisher - Subscriber package tombola; public interface Publisher { public void subscribe(Object sender); public void

Fondamenti di Java

Static

Page 13: Esempio: Tombola! Parte seconda. Publisher - Subscriber package tombola; public interface Publisher { public void subscribe(Object sender); public void

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.

Page 14: Esempio: Tombola! Parte seconda. Publisher - Subscriber package tombola; public interface Publisher { public void subscribe(Object sender); public void

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

Page 15: Esempio: Tombola! Parte seconda. Publisher - Subscriber package tombola; public interface Publisher { public void subscribe(Object sender); public void

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

Page 16: Esempio: Tombola! Parte seconda. Publisher - Subscriber package tombola; public interface Publisher { public void subscribe(Object sender); public void

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

Page 17: Esempio: Tombola! Parte seconda. Publisher - Subscriber package tombola; public interface Publisher { public void subscribe(Object sender); public void

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

Page 18: Esempio: Tombola! Parte seconda. Publisher - Subscriber package tombola; public interface Publisher { public void subscribe(Object sender); public void

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

Page 19: Esempio: Tombola! Parte seconda. Publisher - Subscriber package tombola; public interface Publisher { public void subscribe(Object sender); public void

Input/Output, Eccezioni

Page 20: Esempio: Tombola! Parte seconda. Publisher - Subscriber package tombola; public interface Publisher { public void subscribe(Object sender); public void

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

Page 21: Esempio: Tombola! Parte seconda. Publisher - Subscriber package tombola; public interface Publisher { public void subscribe(Object sender); public void

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

Page 22: Esempio: Tombola! Parte seconda. Publisher - Subscriber package tombola; public interface Publisher { public void subscribe(Object sender); public void

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"

Page 23: Esempio: Tombola! Parte seconda. Publisher - Subscriber package tombola; public interface Publisher { public void subscribe(Object sender); public void

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

Page 24: Esempio: Tombola! Parte seconda. Publisher - Subscriber package tombola; public interface Publisher { public void subscribe(Object sender); public void

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