2015-06-02 22 views
14

Un'istanza di una classe, in Java, in grado di accedere ai campi privati ​​di una diversa istanza di un proprio tipo, come nel seguente elenco:Perché un'istanza di una classe può accedere a campi privati ​​di un'altra istanza del proprio tipo?

public class Foo { 
    private int secret; 
    public void bar(final Foo foo) { 
    foo.secret = 100; 
    } 
} 

Quale sarebbe l'argomento per tale semantica (quando si progetta un linguaggio)?

+0

Bene, è tutto di una classe, quindi è possibile accedere ai propri membri privati. Ad esempio, se non vuoi aggiornare 'secret', non farlo. La codifica non può proteggerti da te stesso. – markspace

+3

La definizione di 'private' dice che solo le istanze di' Foo' possono accedervi. Dato che sei in "Foo" puoi accedervi. –

+0

La semantica del linguaggio permette questo, mi chiedo perché. –

risposta

12

Bene, prima devi chiedere "perché hanno campi privati?"

I campi privati ​​sono principalmente per l'incapsulamento: un utente di una classe non deve conoscere i componenti interni dell'implementazione di quella classe. In effetti, essi non dovrebbero sapere , perché se si basavano su quelle specifiche, l'implementatore sarebbe costretto a supportarle o interrompere la compatibilità all'indietro. In altre parole, protegge sia l'utente e progettista della classe:

  • l'utente è protetto da modifiche di implementazione rompere il suo codice
  • il progettista è protetto da dover tenere i dettagli di implementazione caratteristiche immutate per sempre

Ma una classe non ha bisogno di essere protetta da se stessa; non ha bisogno di preoccuparsi del caso in cui un bit del suo codice cambia, ma un altro bit (che utilizza il primo bit) non può cambiare. La retrocompatibilità non è un problema, perché la classe è sviluppata come un unico blocco atomico di codice. In altre parole, nessuna delle protezioni di cui sopra è necessaria.

Poiché non è necessario proteggere i campi e poiché è spesso necessario vederli (ad esempio, per confrontare se due oggetti sono uguali), sono visibili all'interno della classe.

+0

Perché un codice di classe non può cambiare nelle versioni? (Probabilmente non ti capisco.) Direi: _ "Le modifiche all'interno della classe, possono essere facilmente modificate dal designer per supportare qualsiasi modifica. I campi pubblici non possono, poiché possono rompere il codice __outside__ l'ambito degli autori. "_ – Mordechai

+0

@MouseEvent perché gli interni sono soggetti a modifiche. Immagina di affidarti ai campi interni della classe 'FileInputStream' e all'improvviso NIO viene fuori dal fatto che' FileInputStream' è stato completamente modificato per trarre vantaggio dalle operazioni io native. Ora improvvisamente il campo che legge il tuo codice non è più lì poiché è implementato nel codice nativo. – RecursiveExceptionException

1

È possibile copiare/confrontare i valori senza getter aggiuntivi e cambiare campo senza setter. Non so se nella JVM tali metodi semplici invocazioni siano ottimizzati in alcun modo, ma se non lo sono, allora produce un sovraccarico.

Si potrebbe pensare che mantenere un accesso così "aperto" possa portare ad alcuni problemi di sicurezza, ma quando si implementa una classe si forniscono tutti i metodi per la manipolazione di queste variabili. Nessuno può cambiarle dalle classi che estendono questa classe. In realtà, sono ancora privati, accessibili solo dal tuo codice.

Tenete anche presente che logicamente una classe è spesso destinata a fare un lavoro. Può essere utile condividere alcune informazioni e facilitare l'accesso, specialmente nei casi in cui vengono prodotte grandi quantità di istanze. Quando si tratta di casi in cui è necessario un maggiore controllo, è sempre possibile utilizzare il modificatore di accesso al pacchetto (che è più "privato" in un certo senso ...) o limitare il conteggio delle istanze con un modello singleton/factory.

2

Il campo private ha lo scopo di dire agli altri programmatori di non scherzare.

Presumibilmente, tutti coloro che lavorano in una singola classe sanno cosa fanno tutte le variabili. Il campo private non nasconde il tuo codice da te, solo dall'esterno.