Autor | Zpráva | ||
---|---|---|---|
Mufna Profil |
Zdravím Vás. Nevím zda se tady najde někdo kdo dělá v Javě (ne v JavaScriptu), ale zkusím to. Pokud někdo takový je, tak snad můj dotaz nebude moc složitý.
Mám konstruktor: Matice(int radku, int sloupcu) { if (radku == 0 || sloupcu == 0) { this.matice = null; // možná že toto je špatně a proto to nefunguje ! System.out.println("Matice nemuze mit nulovy rozmer"); } else { this.matice = new int[radku][sloupcu]; } } a v metodě main() pak nejprve vytvořím dva objekty třídy Matice a poté podmínkou testuji, zda některý z rozměrů matice (zadány jsou parametrem) není nulový (resp. testuji to jako že pokud je nulový, tak už konstruktor by měl "vytvořit" matici jako NULL). Pokud tomu tak je, tak nechci, aby se matice generovala a vypsala se pouze hláška "Matice nemuze mit nulovy rozmer". Zatím mi to ale asi tu podmínku nevyhodnocuje, protože se tento kód vždy pokusí matici vygenerovat (což samozřejmě skončí chybou - typu NullPointerException) public static void main(String[] args) { Matice matA = new Matice(0,0); Matice matB = new Matice(0,1); if (matA != null || matB != null) { matA.generujMatici(); // pokud je některý rozměr nulový, tak tohle už se nemá vůbec provádět matB.generujMatici(); // pokud je některý rozměr nulový, tak tohle už se nemá vůbec provádět } } Poradíte prosím někdo co s tím mám udělat, aby to fungovalo tak jak chci ? |
||
Alphard Profil |
#2 · Zasláno: 29. 6. 2012, 14:32:14
Matice matA = new Matice(0,0); Takový workaround je dát tam factory metodu, která už null vrátit může. Nebo to řešit výjimkami, resp. v té následné podmínce neporovnávat samotný objekt, ale nějakou jeho vlastnost. |
||
Mufna Profil |
#3 · Zasláno: 29. 6. 2012, 14:39:27
Alphard:
A nedá se ta podmínka v main() sestavit nějak jinak, ale tak, aby fungovala jak potřebuji ? Tzn. zjistit tedy nějaké vlastnosti objektu a podle nich rozhodnout ? Např. nešlo by to nějak přes: matA.length |
||
juriad Profil |
#4 · Zasláno: 29. 6. 2012, 14:40:01
Konstruktor ti vždy vytvoří objekt, nebo selže výjimkou. Nesnaž se vytvářet nefunkční matici, zaděláváš si na problémy.
Máš několik možnosti: 1) místo řádků 3, 4 vyhoď výjimku: throw new IllegalArgumentException("Matice nemuze mit nulovy rozmer")
2) vytvořit factory method: public static Matice novaMatice(int radku, int sloupcu) {if(radku>0 && sloupcu>0) return new Matice(radku, sloupcu); return null; }
a budeš volat Matice.novaMatice(0, 0) a Matice.novaMatice(0,1) 3) na označeném řádku kontroluj: if(matA.matice !=null || matB.matice != null)
4) vytvořit si potomka: BlbaMatice extends Matice {...} a v kombinaci s 2) nevratis null, ale return new BlbaMatice();
nejlepší je 1 pěkné řešení je 4 na pomezí je 2, pořád potom musíš kontrolovat nenullovost řešení 3 se zdaleka vyhni |
||
Mufna Profil |
#5 · Zasláno: 29. 6. 2012, 14:46:07
juriad
díky moc, zkusím ty možnosti projet |
||
juriad Profil |
#6 · Zasláno: 29. 6. 2012, 14:59:42
snaž se uvažovat takto:
navrhuji třídu Matice, která bude fungovat jako matice a bude mít z toho vyplývající omezení platí invariant: matice má alespoň jeden řádek a alespoň jeden sloupec, kdykoli bys měl dostat něco jiného, vyhoď výjimku, protože to už není podle invariantu matice jak bys řešil situaci: new Matice(-2, -3) ? To už vůbec není matice, ani se nad tím nedá nijak uvažovat, takže rovnou chyba!
proč se od toho případ new Matice(0, cokoli) liší?
snaž se navrhnout třídy tak, aby byly správné bez ohledu na to jak je budeš používat, proto je spoléhání na vnitřní vlastnosti chybné |
||
Časová prodleva: 11 let
|
0