Diskuze: Volání objektu na objekt
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 10 zpráv z 10.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.
No očividně jsi se učil na zdejších tutoriálech viď?:(
A přesně, co jsem tolikrát tak často zmiňoval - tyto stránky jsou
perfektní, ale tutoriál na Javu naprosto ignoruje zapouzdření a taky ten
kód tak šíleně vypadá:(
Metoda Insert asi podle názvu bude vkládat prvky do seznamu. Předpokládám, že třída Node reprezentuje 1 položku ze seznamu, která si jen pamatuje nějakou hodnotu a odkaz na další položku. (tady bych se trošku zamyslel nad logikou aplikace - asi by bylo možná lepší předávat jako parametr v metodě insert přímo objekt Node). Když se přidává do seznamu položka, tak seznam vyžaduje, aby každý Node měl současně odkaz na svojeho "následníka". Takže když přidáváš Noda, tak si vezmeš poslední Node v seznamu (je v atributu last), přidáš tomuto Nodovi toho nového Noda, (prostě last.next zavolá atribut toho posledního noda, jde to tak, ale je to čuňárna). A ten nový Node nastavíš jako last, takže při příštím vkládání bude on ten, kdo si přidá nového noda.
A toto je právě to, o čem jsem mluvil na začátku. Je to svinstvo a
rozhodně to není čisté OOP programování. Jde to, ale porušuje to
zapouzdření. Princip zapouzdření spočívá v tom, že by žádný jiný
objekt neměl přistupovat přímo k atributům jiného objektu. Proto existují
tzv. přístupové metody (access methods) známé taky jako settry a gettry.
Pokud chceš aby měl "zbytek světa" přístup k atributům třídy, tak pro
nastavování tohoto atributu použij metodu setNazevAtributu(parametr) a pro
získání tohoto parametru použij metodu getNazevAtributu(). Dřív to byla
pouze zavedená konvence,
dneska je to naprostý standart. (a dokonce dnešní IDEčka už umožňují
vygenerovat přímo settry, gettry nebo současně i settry a gettry u
vybraných parametrů)
Samozřejmě - jak vidíš, tak to jde i bez zapouzdření, ale vzniká velké nebezpečí a navíc ten kód vypadá strašně.
this.last.next = n;
Jak mohu volat na objekt další objekt? (který není ani inicializovaný)
Nevoláš tedy objekt na objekt, ale voláš atribut objektu. Buď tečkou můžeš volat metody (a to bys měl v OOP pouze a jenom) a nebo volat atribut této třídy.
Mockrát děkuji . Tenhle kod není psaný mnou, právě proto mě to dost zmátlo, protože jsem se s tímhle způsobem volání atributu nesetkal. Gettery/settery používám běžně, ale nenapadlo mě, že to lze pomocí toho tady přepsat.:)
dobrý, tak se to tak ani neuč:D
Primy pristup k atributum tridy Node v tomto pripade neni porusenim principu
zapouzdreni, protoze trida Node je privatni a tedy viditelna jen v ramci
implementace tridy LinkedList. Kdyz se treba podivas na implementaci LinkedList
v JDK 8 tak to delaji uplne stejnym zpusobem, jen je Node genericky.
Pouzivat tridu Node jako parametr metody insert je taky spatny napad, protoze
tim by jsi vystavil vnitrni implementaci vazeb linked listu vsem kdo pouzivaji
dany linked list. Kdokoli by mohl rozbit vazby v tom linked listu. Vystaveni
tridy Node by bylo prave poruseni zapouzdreni tridy LinkedList.
Na tridu Node v tomto konkretnim pripade se nelze divat jako na klasickou java
tridu. V tomto pripade se jedna spise o interni datovou strukturu jine tridy.
Samozrejme syntakticky to trida je, protoze java nema nic jako datove
struktury.
Co si myslíš, že je lepší?
player.addExperience(42);
anebo
player.setExperience(player.getExperience() + 42);
this.last.next = n;
Ale je inicializovaný.
if (size == 0)
protože jsme v konstruktoru definovaly size = 0 tak vždy první porovnání(vyhodnocení) if končí true co vede k cyklu kdy se tvz. přiřadí reference privatním proměnným first a last třídy LinkedList.
if (size == 0) {
this.first = n;
this.last = n;
}
A na konci metody insert zvýšíš proměnou size o 1.
size++;
else {
this.last.next = n;
this.last = n;
}
takže vidíš že last je inicializovaný a tudíž k jeho proměnné lze přistupovat a provést nastavení.
Prvá možnosť je síce zrozumiteľnejšia a prehľadnejšia, ale java "style" je ten druhý prípad.
trošku nechápu tvůj dotaz, protože to máš dva rozdílné výsledky....
player.addExperience(42);
ti nastaví hodnotu na 42
player.setExperience(player.getExperience() + 42);
ti zvýší aktuální hodnotu o 42.... Nechápu co to má společného s tímto ticketem a už vůbec s tím, co jsem psal já....
Zobrazeno 10 zpráv z 10.