t2 píše:Ahoj
pri b = false nevznika novy objekt.
To nie je pravda, stačí si skúsiť:
Kód: Vybrat vše
public class BooleanOutput {
static void skuska( Boolean b ) {
Boolean old = b;
b = true;
System.out.println( old == b ); // false, takže nejsou stejné !!!
}
public static void main(String[] args) {
Boolean b = false;
System.out.println( b );
skuska( b );
System.out.println( b );
}
}
Dôvod je jednoduchý v Jave 1.5 je
iba náhražkou
v jave 1.4 to bolo potreba písať, v 1.5 to uľahčili ale pre ľudí, ktorí si Javu 1.4 nezažili je to mätúce...
t2 píše:Problem je, ze ty mas dve boolean premenne, jedna je v metode main a druha metode skuska.
Toto tiež nie je pravda, veď si uvedom, že keby toto bola pravda, tak nefunguje ani ten Tvoj príklad. Objekty sa predávajú odkazom a primitívne typy hodnotou (predstav si, že by si do metódy predával obrovský objekt a on by sa celý najprv zduplikoval, to je dôvod prečo to nefunguje a to nehovorím o tom, že ani nie je jasné ako urobiť kópiu objektu), správne je to, čo písal kolega vyššie - wrapper typy sú immutable, teda nemeniteľné.
Okrem spôsobu s ErrorState existuje spôsob bez vytvárania novej triedy:
Kód: Vybrat vše
public class BooleanOutput {
static void skuska2( Boolean[] b ) {
b[0] = true;
}
public static void main(String[] args) {
System.out.println( b );
Boolean[] ba = new Boolean[] {b};
skuska2( ba );
System.out.println( ba[0] );
}
}
ale ani tento spôsob by som nedoporučoval, z hľadiska OOP a dizajnu je správne, aby si urobil tzv. krabičku (Crate), ktorá obalí obe návratové hodnoty:
Kód: Vybrat vše
public class BooleanOutputCrate {
static Crate skuska() {
return new Crate( 10, false );
}
public static void main(String[] args) {
skuska();
}
static class Crate {
int i;
boolean b;
Crate( int i, boolean b ) {
this.i = i;
this.b = b;
}
}
}
Pretože output parametre sú nečitateľné pre niekoho, kto daný kód nepozná.