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();
}
}
Gioco
2 6 7 Pippo0
2 7 8 Pippo1
1 5 6 Pippo2
2 4 7 Pippo3
5 6 8 Pippo4
3 4 6 Pippo5
4 5 7 Pippo6
6 7 8 Pippo7
3 4 7 Pippo8
1 2 5 Pippo9
==> Estratto il numero:4
Pippo3 ha il numero 4
Pippo6 ha il numero 4
Pippo5 ha il numero 4
Pippo8 ha il numero 4
==> Estratto il numero:2
Pippo3 ha il numero 2
Pippo1 ha il numero 2
Pippo9 ha il numero 2
Pippo0 ha il numero 2
==> Estratto il numero:5
Pippo4 ha il numero 5
Pippo2 ha il numero 5
Pippo6 ha il numero 5
Pippo9 ha il numero 5
==> Estratto il numero:6
Pippo4 ha il numero 6
Pippo2 ha il numero 6
Pippo5 ha il numero 6
Pippo0 ha il numero 6
Pippo7 ha il numero 6
==> Estratto il numero:1
Pippo2 ha il numero 1
Pippo2 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 1
class S {
static int instanceCount = 0; //variabile “di classe”
S() {instanceCount++;}
}
public class A {
public static void main(String a[]) {
new A();
Output:
}
# of instances:
A() {
for (int i = 0; i < 10; ++i) {
S instance=new S();
}
System.out.println("# of instances:
"+S.instanceCount);
}
}
10
Variabili “static”: esempio 2
class 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();}
Output:
A() {
for (int i = 0; i < 10; ++i) { # of instances:
# of instances:
S instance=new S();
}
System.out.println("# of instances:
"+S.instanceCount);
System.gc(); System.runFinalization();
System.out.println("# of instances:
"+S.instanceCount);
}
}
10
0
Metodi “static”: esempio 1
class S {
static int instanceCount = 0; //variabile “di classe”
S() {instanceCount++;}
static void azzeraContatore() {instanceCount=0;}
}
Può agire solo su
public class A {
public static void main(String a[]) { variabili statiche!
new A();
Output:
}
instanceCount: 2
A() {
for (int i = 0; i < 10; ++i) {
if (i%4==0) S.azzeraContatore();
S instance=new S();
}
System.out.println("instanceCount:
"+S.instanceCount);
Ruolo: Metodi che agiscono su
}
variabili statiche
}
metodi “static”: esempio 2
Notare la
maiuscola!
(per convenzione)
Math.sqrt(double x);
System.gc();
System.arrayCopy(...);
System.exit();
Integer.parseInt(String s);
Float.parseFloat(String s);
Ruolo:
analogo alle
librerie del C
Che cos’e’:
System.out.println() ?
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 stringhe
Dammi una stringa
abracadabra
Hai scritto abracadabra
import 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(); }
}
Lettura di int
public 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 intero
2
Hai scritto 2
public 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();}
}
Lettura di int
Dammi un intero
pippo
java.lang.NumberFormatException: For input string: "gh"
at
java.lang.NumberFormatException.forInputString(NumberFormatException.ja
va: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"
public A() {
Dammi un float
pippo
float f=0; boolean error;
Input non valido
BufferedReader s = new BufferedReader( Dammi un float
new InputStreamReader(System.in)); 3
Hai scritto 3.0
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();}
}
Lettura di float
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
Scarica

05.4