2009-04-27 10 views

risposta

7

Io non tendono a pensare in termini di una oggetto avere accesso ad un altro, ma piuttosto ciò che codice ha accesso ai dati quali all'interno di un oggetto.

In Java (e C#, btw) il codice all'interno di una classe ha accesso ai membri privati ​​di qualsiasi oggetto della stessa classe. Quindi hai accesso al pacchetto/assembly e accesso pubblico.

Lo spinoso è protetto l'accesso, che è sorta di accesso al codice in sottoclassi - ma dipende l'oggetto di destinazione: si è permesso solo di accedere ai membri protetti di un oggetto se si tratta di un'istanza dello stesso digita come la posizione del codice, o qualche sottoclasse, anche se è esposto da una classe genitore. Così, per esempio, supponi di avere:

class Parent 
{ 
    protected int x; 
} 

class Child1 extends Parent 
class Child2 extends Parent 
class Grandchild extends Child1 

Poi all'interno del codice Child1, è possibile accedere Parent.x solo per gli oggetti che sono noti (al momento della compilazione) per essere casi di Child1 o Grandchild. Ad esempio, non è possibile utilizzare new Parent().x o new Child2().x.

2

No, campi privati ​​si può accedere anche da altri casi (all'interno di un metodo della stessa classe).

Non è possibile accedervi da sottoclassi, tuttavia, nemmeno all'interno della stessa istanza.

Fornisci metodi getter per consentire al codice "esterno" di accedere ai campi della classe. Dal momento che spetta a te ciò che ottieni, quanto visibile li fai e come sono implementati, puoi esercitare un controllo molto elevato su chi può accedere ai dati e come.

Si noti che non c'è davvero bisogno di essere un campo name se c'è un getName: dipende interamente dall'implementazione del getter da cui provengono i dati.

Anche se il getter (o setter) avvolge solo un campo privato, è opportuno avere questi setter e getter (al contrario di consentire l'accesso diretto al campo).

1

getName() deve restituire il nome (campo o qualche altra "cosa").

+0

Bene, dovrebbe restituire il nome. Se è contenuto in un campo chiamato nome o se è derivato da qualche altro oggetto, ecc. È un dettaglio di implementazione. –

1

Anche se un campo/metodo è "privato", è comunque possibile accedere/richiamare tramite riflessione a meno che non si installi un gestore di sicurezza personalizzato che non lo consente.

+0

È anche possibile accedere ai campi tramite JNI. Che importa? (Inoltre, non è necessario che il responsabile della sicurezza sia personalizzato.) –

+0

Bene, sì. Questo è uno dei motivi per evitare di riflettere se possibile. – sleske

1

L'idea di incapsulamento è consentire alle implementazioni di diverse unità di variare liberamente. Sebbene parliamo di oggetti, per incapsulamento intendiamo veramente un'unità di codice. Nei linguaggi basati su classi, l'unità di codice è solitamente la classe [outer].

Succede anche che le operazioni binarie (come gli uguali) diventino sciocchezze senza accesso all'interno della stessa classe.Quindi privato significa privato per la classe [esterna], non privato della stessa classe all'interno della stessa istanza.

I metodi di accesso in genere indicano una progettazione errata su qualsiasi cosa tranne che oggetti di valore semplice (solo getter). Gli oggetti dovrebbero avere un comportamento, piuttosto che essere una mera raccolta di dati. Sposta il codice che sarebbe all'esterno usando i getter a un metodo che è significativo sull'oggetto. Mano sul cuore, il 99% dei getter tempo restituisce solo un valore di campo. C'è un valore relativamente piccolo nel rendere privato un campo se si aggiungono getter e setter.

0

Quali sono i "metodi di accesso" in Java - metodi come getName()?

Sì - getFoo() e setFoo() sono metodi di accesso per una "proprietà" di nome foo - questo fa parte della specifica JavaBeans. Il motivo per cui questi sono preferiti sui campi pubblici è che ti permettono di avere solo un getter (rendendo la proprietà di sola lettura), fare contabilità aggiuntiva (come il calcolo dei campi derivati) e la convalida dei valori impostati (lancio ad esempio di PropertyVetoException quando il valore è non accettabile).

L'idea era originariamente pensata per essere utilizzata con strumenti GUI che consentissero di configurare graficamente e combinare JavaBeans per "creare applicazioni". Questo si è rivelato essere in gran parte un sogno irrealizzabile, ma il concetto di JavaBeans e proprietà si è rivelato utile per la normale codifica e si è diffuso.

Molte persone fraintendono il concetto e ritengono che "incapsulamento" significa solo scrivere setter e getter per le proprietà private, invece di renderlo pubblico - e quindi prendere in considerazione giustamente che idiota. Incapsulamento significa non esporre i meccanismi interni di una classe a tutti tranne che in modi strettamente controllati. In una buona progettazione OO, non dovresti avere troppi metodi di acquisizione e pochissimi metodi di set in una classe.

0

Gli oggetti incapsulano i dati in modo che nemmeno altre istanze della stessa classe possano accedere ai dati?

Certo, se non si utilizzano membri statici.

Estratto this link:

A volte, si desidera avere le variabili che sono comuni a tutti gli oggetti. Questo è realizzato con il modificatore statico. I campi che hanno il modificatore statico nella loro dichiarazione sono chiamati campi statici o variabili di classe

Problemi correlati