Dne 5.4.2011 08:41, Libor Jelinek napsal(a):
Ovšem do jaké podoby přepsat Zamestnanec.getNarozeni(), aby teda nevracela referenci na privátní objekt Date, ale kopii. Tedy odolné proti zam.getNarozeni().setTime(0L);, aby i po tomto příkazu zůstalo datum narození v nezměné?První co mě napadá je přepsat getNarozeni() na toto: public Date getNarozeni() { Zamestnanec kopieZamestnance = new Zamestnanec(narozeni); return kopieZamestnance.getNarozeni(); } Ovšem s tím nepochodím a skončím s ošklivou chybou: Exception in thread "main" java.lang.StackOverflowError at Zamestnanec.<init>(ZmenaBezSetteru.java:16) at Zamestnanec.getNarozeni(ZmenaBezSetteru.java:21) (a tento řádek vypsán ještě asi 30x :-)) Proč skončí tato varianta s vytvořením nového objektu na sebe sama s chybou StackOverflowError? Když zkusím druhé co mě napadá na toto:
Protože ta metoda volá sama sebe v nekonečné rekurzi, takže přeteče zásobník. I kdyby se přepsala, tak to stejně nepomůže, protože objekt typu Date je stále tentýž i v nové kopii Zamestnanec, neboť se jí předá v konstruktoru na něj ukazatel a ten se uloží i v nové kopii.
public Date getNarozeni() { return (Date) narozeni.clone(); } Pak již hlavní program vypíše 2x po sobě stejné datum.
Buď tak, a nebo public Date getNarozeni() { return new Date(narozeni.getTime()); } Makub -- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Supercomputing Center Brno Martin Kuba Institute of Computer Science email: ma...@ics.muni.cz Masaryk University http://www.ics.muni.cz/~makub/ Botanicka 68a, 60200 Brno, CZ mobil: +420-603-533775 --------------------------------------------------------------
smime.p7s
Description: S/MIME Cryptographic Signature