2015-06-02 17 views
14

Eine Instanz einer Klasse, in Java, können private Felder einer anderen Instanz von seiner eigenen Art, zugreifen wie in der folgenden Auflistung:Warum kann eine Instanz einer Klasse auf private Felder einer anderen Instanz eines eigenen Typs zugreifen?

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

Was das Argument für eine solche Semantik wäre (wenn eine Gestaltung Sprache)?

+0

Nun, es ist alles eine Klasse, so dass Sie Ihre eigenen privaten Mitglieder zugreifen können. Wenn Sie zum Beispiel 'secret' nicht aktualisieren wollen, tun Sie das nicht. Die Codierung kann Sie nicht vor sich selbst schützen. – markspace

+3

Die Definition von 'privat' besagt, dass nur Instanzen von' Foo' darauf zugreifen können. Da du in "Foo" bist, kannst du darauf zugreifen. –

+0

Die Semantik der Sprache erlaubt dies, ich frage warum. –

Antwort

12

Nun, zuerst müssen Sie fragen, "warum private Felder überhaupt haben?"

Private Felder sind in erster Linie für die Kapselung: Ein Benutzer einer a-Klasse sollte nicht die Interna der Implementierung dieser Klasse kennen müssen. In der Tat, sie sollten nicht wissen, denn wenn sie sich auf diese Besonderheiten verlassen, dann wäre der Implementierer gezwungen, sie zu unterstützen oder Rückwärtskompatibilität zu brechen. Mit anderen Worten, es schützt sowohl den Anwender und Designer der Klasse:

  • wird der Benutzer von der Implementierung Änderungen geschützt ihren Code zu brechen
  • die Designer aus, die halten Funktionen Implementierungsdetails unverändert für immer
geschützt

Aber eine Klasse muss nicht vor sich selbst geschützt werden; es muss sich nicht um den Fall kümmern, in dem sich ein Bit seines Codes ändert, aber ein anderes Bit (das das erste Bit verwendet) kann sich nicht ändern. Rückwärtskompatibilität ist kein Problem, da die Klasse als einzelner, atomarer Codeabschnitt entwickelt wird. Mit anderen Worten, keiner der obigen Schutz wird benötigt.

Da die Felder nicht geschützt werden müssen und es oft notwendig ist, sie zu sehen (z. B. um zu vergleichen, ob zwei Objekte gleich sind), sind sie in der Klasse sichtbar.

+0

Warum kann der Code einer Klasse in Versionen nicht geändert werden? (Ich habe Sie wahrscheinlich einfach nicht verstanden.) Ich würde sagen: _ "Änderungen in der Klasse können vom Designer leicht geändert werden, um Änderungen zu unterstützen. Öffentliche Felder können nicht, da sie den Code außer Kraft setzen können. "_ – Mordechai

+0

@MouseEvent, da interne Änderungen vorbehalten sind. Stellen Sie sich vor, Sie würden sich auf interne Felder der 'FileInputStream'-Klasse verlassen und plötzlich kommt NIO heraus, wobei' FileInputStream' vollständig geändert wurde, um native io-Operationen zu nutzen. Jetzt ist das Feld, das dein Code liest, plötzlich nicht mehr da, da es in nativem Code implementiert ist. – RecursiveExceptionException

1

Sie können Werte ohne zusätzliche Getter kopieren und vergleichen und das Feld ohne Setter ändern. Ich weiß nicht, ob in der JVM solche einfachen Methodenaufrufe in irgendeiner Weise optimiert werden, aber wenn nicht, dann erzeugt dies einen gewissen Overhead.

Man könnte denken, dass ein solcher "offener" Zugriff zu einigen Sicherheitsproblemen führen kann, aber wenn Sie eine Klasse implementieren, stellen Sie alle Methoden zur Manipulation dieser Variablen bereit. Niemand kann sie von Klassen ändern, die diese Klasse erweitern. In der Tat sind sie immer noch privat - zugänglich nur von Ihrem Code.

Denken Sie auch daran, dass logisch eine Klasse oft für eine Aufgabe bestimmt ist. Es kann vorteilhaft sein, einige Informationen zu teilen und den Zugriff zu erleichtern, insbesondere in Fällen, in denen große Mengen von Instanzen erzeugt werden. Wenn es sich um Fälle handelt, in denen mehr Kontrolle benötigt wird, kann man immer den Paketierungszugriffsmodifikator verwenden (der in gewissem Sinne "privater" ist) oder die Anzahl der Instanzen mit einem Singleton/Factory-Muster begrenzen.

2

Das Feld private soll anderen Programmierern sagen, dass sie sich damit nicht anlegen sollen.

Vermutlich weiß jeder, der in einer einzelnen Klasse arbeitet, was alle Variablen tun. Das Feld private versteckt Ihren eigenen Code nicht nur von außen.

Verwandte Themen