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
--------------------------------------------------------------

Attachment: smime.p7s
Description: S/MIME Cryptographic Signature

Odpovedet emailem