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
Matice matA = new Matice(0,0);
Je vytvoření objektu. Konstruktor nemá nemá return, protože nemůže nic vracet, ani null.
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
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
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
juriad

díky moc, zkusím ty možnosti projet
juriad
Profil
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é

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: