2009-10-10 4 views
11

Ich schreibe eine equals(Object obj) Funktion für eine Klasse. Ich sehe, dass es möglich ist, auf die privaten Felder von obj vom Anrufer zuzugreifen. Anstatt also einen Getter zu verwenden:Java: Zugriff auf private Felder direkt von einer anderen Instanz der gleichen Klasse

Odp other = (Odp) obj; 
if (! other.getCollection().contains(ftw)) { 

} 

Ich kann nur das Feld direkt zugreifen:

Odp other = (Odp) obj; 
if (! other.collection.contains(ftw)) { 

} 

Ist die schlechte Praxis?

+1

Möglicherweise handelt es sich nicht um ein exaktes Duplikat, sondern sehr nahe: http://stackoverflow.com/questions/1540159/using-getters-or -using-direct-field-access-in-a-pojo – ChssPly76

Antwort

6

Nein, ist es nicht. Der Grund dafür, dass private Variablen und Methoden nicht von anderen Klassen aus zugänglich sind, besteht darin, dass Sie die Interna Ihrer Klasse ändern können, ohne den gesamten Code, der die Klasse verwendet, zu ändern und den Benutzer Ihrer Klasse daran zu hindern, zB eine Variable zu setzen zu einem Wert, den es nie haben soll).

Wenn Sie private Variablen anderer Objekte verwenden, schadet nichts, denn wenn Sie die Interna Ihrer Klasse restrukturieren, müssten Sie den Code in der Klasse trotzdem ändern.

+1

Nur weil es in 99% der Fälle funktioniert, heißt das nicht, dass es das Richtige ist. Es bricht die Verkapselung ab und koppelt die Klassen enger aneinander als nur das Speichern von fünf Zeichen. Bitte sehen Sie meine Antwort. –

+3

"koppelt die Klassen enger zusammen" - welche Klassen? Es gibt hier nur eine Klasse, und Sie können eine Klasse nicht von sich selbst "entkoppeln". – sepp2k

+1

Nicht unbedingt. Der Parameter, der an equals() übergeben wird, ist nicht unbedingt dieselbe Klasse. –

9

Ich neige dazu, immer Getter zu verwenden, weil ein Getter manchmal nicht einfach "Return (foo)" ist. Manchmal initialisieren sie Dinge, wenn sie null sind, oder haben eine Debug-Protokollierung in ihnen, oder validieren den aktuellen Zustand in irgendeiner Weise. Es ist konsistenter.

+0

+1 Wenn aus irgendeinem Grund "Sammlung" kann ren sein Um klarzustellen, dass es Sinn ist, würde ich es lieber an einer Stelle ändern, anstatt an jeder Stelle, wo der Getter verwendet worden wäre. –

1

Das ist in Ordnung und völlig normal. Es ist ein wenig seltsam zu denken, dass this mit den privaten Feldern von other fiedeln kann, aber es ist in Ordnung, weil es keine Möglichkeit gibt, dass irgend etwas Schlimmes passieren kann, so weit wie ein Dritter mit einem Odp Objekt Interna meckern kann. Jede Methode der Klasse Odp kann alle privaten Mitglieder eines beliebigen Objekts ändern, sogar nicht this, aber das ist in Ordnung, da solche Methoden offensichtlich vertrauenswürdig sind!

5

Ich denke nicht, dass dies eine schlechte Übung ist, aber ein Merkmal der Sprache. Es erlaubt Ihnen nicht nur, equals auf die Art zu testen, wie Sie es tun, sondern es ist auch in einem Prototyp-Muster für die Objekterstellung nützlich.

0

Die Verwendung des privaten Members für die Entitätsklasse kann dazu führen, dass die Proxyklasse nicht ordnungsgemäß funktioniert. Stellen Sie sich Hibernate vor, erstellen Sie eine Klasse durch faule Abfrage. Wenn Sie die Elementvariable überprüfen, wird null zurückgegeben. Wenn Sie jedoch get() aufrufen, ruft es Daten aus der Datenbank ab und initialisiert das Feld.