Newsgroup: it.comp.java
Titolo: Domanda banale su private: il costruttore di una classe che riceve un oggetto di tale classe vede campi privati?

Ciao a tutti, ho un dubbio di questo tipo:
ho modo in un costruttore che riceve come parametro un oggetto della 
medesima classe di accedere direttamente ad un campo "private" di tale 
oggetto?
Ad esempio:
classe "Prova" ha un campo "private int a"
Il costruttore con prototipo "Prova(Prova obj)" può accedere a obj.a?
  ciao e grazie anticipatamente per le risposte!

 oggetto?
solo se il tipo del parametro e quello di this sono lo stesso.
-- 
++ Fino all'anno scorso avevo un solo difetto. Ero presuntuoso.
http://unopuntozero.wordpress.com/
http://www.flickr.com/photos/marko_po/

  ciao e grazie anticipatamente per le risposte!
-- 
Andrea Francia
http://andreafrancia.blogspot.com/2008/07/colinux-linux-dentro-windows.html

 dipende da quello che stai facendo.
Perchè sarebbe una cattiva idea? Non ci vedo nulla di male che una 
classe acceda ai *propri* attributi privati.
Invece, vista la signature del costruttore, penserei un po' di più se 
serve veramente fare delle copie di un oggetto in quella maniera.
-- 
Lucio Benfante
JUG Padova           
http://www.parancoe.org
 ...have a look at it!
www.jugpadova.it
 
http://www.jugevents.org

classe acceda ai *propri* attributi privati.
Un conto č che il codice della classe acceda agli attributi privati,
un conto č che acceda agli attributi privati di un'istanza della
stessa classe. In questo secondo caso, non č scontato che la classe
debba poterlo fare.

 debba poterlo fare.
che si possa fare ci puoi mettere la mano sul fuoco.
per quanto riguarda la "purezza" di design, il caso in questione è un 
tipico costrutture per copia, quindi non ci vedo niente di che.
senza contare che il costruttore può accedere sicuramente agli attributi 
privati del tipo Prova, ma il parametro può essere anche una sottoclasse 
di Prova con i suoi attributi privati non visibili.


che si possa fare ci puoi mettere la mano sul fuoco.
Lo so che si può fare. Infatti non si stava discutendo di questo.
Come ho già detto, non è scontato che la classe **DEBBA** poterlo
fare. Ribattevo al "non ci vedo nulla di male".

 
Se hai una situzione del tipo
public class Prova {
   private String name;
   Prova(Prova other) {
 
this.name
 = 
other.name
;
   }
   public String getName() {
      return 
this.name
;
   }
}
Vuol dire che nel construttore di copia stai dando per scontato che 
'other' sia una classe Prova potrebbe essere una sottoclasse che usa in 
modo diverso i campi per implementare i metodi dell'interfaccia pubblica 
specificata da prova.
Supponi di estendere Prova in modo che l'ID sia inizializzato in modo lazy.
public class ProvaLazy {
   private String name=null;
   ProvaLazy() {
     super(null);
   }
   public String getName() {
     if(name==null) {
 
this.name
 = ... calcolo complesso
     }
     return 
this.name
;
   }
}
La classe ProvaLazy è una classe Prova ed è conforme all'interfaccia 
pubblica di Prova, nonostante questo il costruttore di copia di Prova() 
fallirebbe perché si basa sul presupposto che l'oggetto other sia 
proprio un Prova e non una sottoclasse.
La soluzione, in questo caso, sarebbe usare l'interfaccia pubblica di 
Prova nel costruttore di copia oppure usare il metodo clone.



Anche perché l'altro oggetto potrebbe essere una sottoclasse e quindi 
usare gli attributi privati in un modo diverso da quello che ti aspetti.


 usare gli attributi privati in un modo diverso da quello che ti aspetti.
la sottoclasse non può usare gli attributi privati del parent.


 proprio un Prova e non una sottoclasse.
questa me la devi spiegare perchè non l'ho capita.
in ogni caso, mi sembra che stiamo girando a vuoto intorno ad un falso 
problema. stai ragionando come se si perdesse il controllo su chi e come 
accede a questi attributi privati: in realtà chi accede è pur sempre un 
metodo della stessa classe...



L'ho fatto ma volevo anche leggere i commenti degli esperti su questo 
tema; in effetti si č scatenato un dibattito che, per me che sono un 
novizio di Java, č stato istruttivo.
Una cosa puň essere possibile (scrivendo il codice ed eseguendo il 
programma d'esempio ti accorgi in un attimo che funziona) ma 
sconsigliata (il fatto che non č buona prassi lo potresti venire a 
scoprire dopo molto tempo che impieghi la nozione imparata oppure puoi 
impararlo subito perchč qualcuno piů esperto ti ha spiegato il perchč): 
sentire che č possibile o meno č solo parte delle risposte che si 
possono avere da un simile quesito.
  grazie a tutti per le risposte
-- 
Google Image Labeler cumulative score: 82600