Newsgroup: it.comp.java
Titolo: Membri private.. sono io che non ho capito o e' un bug del linguaggio?

Mi e' capitata sta' cosa:
/**
* classe di prova
*/
public class TestBug {
 private int anInt;
 public TestBug()
 {
  anInt = 0;
 }
 public void setInt( int a )
 {
  anInt = a;
 }
 public int tryTheBug( TestBug b )
 {
  System.out.println( "This is your int: " + b.anInt );
  return b.anInt;
 }
}
/**
* classe per eseguire la prova
*/
public class TestBugMain {
 public static void main( String args[] )
 {
  TestBug b1 = new TestBug();
  TestBug b2 = new TestBug();
  b1.setInt( 10 );
  b2.setInt( 20 );
  // System.out.println(b1.anInt);     //<<< questo qui' e' sbagliato
  b1.tryTheBug( b2 );
  b2.tryTheBug( b1 );
 }
}
Allora, TestBug e' una stupidissima classe con un membro privato di tipo
Int. Io ne alloco 2, adesso, come e' possibile che da b1 possa vedere il
membro privato di b2??? Non dovrebbe essere inaccessibile?
O sono io che non ho capito qualche cosa?
Davide

 Davide
Se contolli sul libro The Java Language Specification -
http://java.sun.com/docs/books/jls/html/6.doc.html#44352
 - vedrai tra
l'altro che "A private class member or constructor is accessible only within
the class body in which the member is declared". Quindi quel che ti succede
è normale - sia b1 che b2 sono istanze della stessa classe TestBug, e quindi
è normale che vedano il contenuto l'una dell'altra. La visibilità 'private'
impedisce a qualsiasi altra classe di vedere la proprietà in questione, ma
non a differenti istanze della stessa classe, come nel tuo caso.
Ciao,
 Stefano
----------
"X WindowSSS, teSSSoro mio... lo odieremo per SSSempre"
Bill Gollum
----------

Grazie per la precisazione.
Davide

 Davide
Dipende da cosa intendi e da cosa esattamente non hai capito, cosa che a sua
volta non si capisce bene dal tuo messaggio :-°
Tecnicamente, il codice non funge come tu immagini semplicemente perchè il
metodo tryTheBug appartiene alla stessa classe del parametro (TestBug), e
dunque ha accesso alla parte privata della classe stessa. Un attributo
privato è accessibile infatti solo dai metodi della classe stessa, e dunque
è inaccessibile da parte di oggetti appartenenti ad altre classi ma
accessibile ad oggetti appartenenti alla stessa classe. Quindi dal punto di
vista del linguaggio va bene così, e non è un bug.
Se però vuoi discutere della validità di questo approccio, che consiste
nell'avere come unità di protezione la classe e non l'oggetto, il discorso
cambia un po' e meriterebbe ulteriori approfondimenti.
Facce sapè...
--
Ugo
__________________________________________________________________________
"La perfezione si ottiene non quando non c'è nient'altro da aggiungere,
 bensì quando non c'è più niente da togliere." Antoine de Saint-Exupéry
__________________________________________________________________________
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Enterprise Java Consulting
@mail: Ugo.L...@Flashnet.it
Home Page: 
http://www.ugolandini.net
Mentoring: 
http://www.projectoo.com
Work Phone: 02/61860647-6-4 06/58332267
Cell Phone: 0347/6310749 - 0347/4783580
Fax Phone: 02/700 413 187
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

>Se però vuoi discutere della validità di questo approccio...
Non era mia intenzione discutere la validita' o meno dell'approccio, solo
stabilire se non avevo capito io o se c'era qualcosa che non andava, sono
arrivato (dopo la tua risposta e quella di Stefano) a stabilire che non
avevo capito io come era impostata la protezione del membro (detto cosi'
sembra una roba sconcia).
Ok, adesso e' chiaro.
Davide