Newsgroup: it.comp.java
Titolo: parametri predefiniti

ciao a tutti.
mi č venuto in mente un possibile problema che, al momento, non afferro 
come risolvere.
in altri linguaggi (vedi C, VB) io posso creare una funzione settando ad 
alcuni parametri il valore predefinito:
f(int a, int b = 0, int c = 1){}
come č possibile riprodurre questa cosa in java?
grazie
Daniele

Ciao, (:-!
Il giorno 13/07/2004 alle ore 17:00 hai scritto:
 D> in altri linguaggi (vedi C, VB) io posso creare una funzione settando ad
 D> alcuni parametri il valore predefinito:
 D>
 D> f(int a, int b = 0, int c = 1){}
 D>
 D> come č possibile riprodurre questa cosa in java?
Con l'overloading:
f(int a)
{
f(int a, 0, 1);
}
f(int a, int b)
{
f(int a, int b, 1);
}
f(int a, int b, int c)
{
}
Bye
-- 
Hard to see, the Dark Side is.
http://www.maccasoft.com

 
forse č piů carino cosě:
f(int a)
{
f(a, 0);
}
f(int a, int b)
{
f(a, b, 1);
}
f(int a, int b, int c)
{
}
Ciriciao!

 Ciriciao!
no, non è corretto
l'overloading lo conosco, ma il caso che dici tu, non prevede la 
possibilità di non specificare b e specificare solo c: infatti 
obbligheresti a chi chiama la funzione a sapere quel è il valore 
predefinito di b, mentre in altri linguaggi non passeresti nulla
(in VB faresti f(1, , 2) , mentre in C non ricordo se ti dava la 
possibilità di lasciare un buco...)
daniele


public class Param {
	private int a, b=0, c=1;
	public void setA(int a){ ... }
	public void setB(int b){ ... }
	public void setC(int c){ ... }
	public int getA(){ ... }
	public int getB(){ ... }
	public int getC(){ ... }
}
public void funzione(Param param){ ... }
Param p = new Param();
p.setA(5);
p.setC(9);
funzione(p);
ciao
--
mauro

Ciao, (:-!
Il giorno 14/07/2004 alle ore 09:25 hai scritto:
 D> no, non è corretto
Lo dici tu.
 D> l'overloading lo conosco, ma il caso che dici tu, non prevede la
 D> possibilità di non specificare b e specificare solo c: infatti
 D> obbligheresti a chi chiama la funzione a sapere quel è il valore
 D> predefinito di b, mentre in altri linguaggi non passeresti nulla
 D> (in VB faresti f(1, , 2) , mentre in C non ricordo se ti dava la
 D> possibilità di lasciare un buco...)
In VB si puo', in C++ e Java non si possono lasciare buchi.
Il problema puo' essere aggirato se i parametri sono di tipi diversi perche'
l'overloading tiene conto anche della classe dei parametri, quindi se hai:
f(Object1 a, Object2 b, Object3 c)
puoi fare tutte le combinazioni che vuoi.


 mauro
ottima soluzione, anche se sarei obbligato a fare una classe...
marco giustamente diceva che funziona tutto con parametri di tipo 
diverso, ma nel caso non li avessi, mi sa che 'unica soluzione č questa.
grazie a tutti
Daniele

 ottima soluzione, 
Bah, mica tanto. Non si riesce a capire cosa è stato impostato e cosa no.
Tutte le variabili vengono messe a zero, quindi anche se non chiami setA
getA restituisce 0.
vi farei notare che:
private int a, b=0, c=1;
e
private int a, b, c=1;
con b non inizializzata (da te) sono la stessa cosa.
La soluzione di Marco è decisamente più elegante, ma secondo me è il tuo
problema che ha poco senso :)
Io riprogetterei la funzione.
Ciao
Matteo
-- 
chi sono e soprattutto chi non sono:
http://www.ilnomedeldominio.it
un piccolo programma per studenti universitari:
http://inutility.ilnomedeldominio.it/imsv/

 Matteo
ciao
--
mauro

 funzioni devi avere per gestire i valori di default??
Dunque, i parametri non sono un array dinamico e non aumentano
spontaneamente. Non mi sembra da tenere in considerazione il possibile
aumento di parametri quando si scrive una funzione altrimenti avremo sempre
qualcosa tipo:
f(CollezioneDiParametri p)
Cmq a questo punto il modo più semplice, secondo me, era usare i wrapper
senza oggetti di mezzo
f(Integer n1, Integer n2, Integer n3)
e per ogni parametro == null si usa il valore di default.
Cmq il sistema non mi piace perché i null in giro sono sempre pericolosi.
Qualcosa puo' facilmente valere null per un bug da qualche parte e così è
impossibile accorgersene. 
