Java: Zugriff auf private Felder direkt aus einer anderen Instanz derselben Klasse aus
Frage
Ich schreibe a equals(Object obj)
Funktion für eine Klasse. Ich sehe, dass es möglich ist, auf die privaten Felder von zuzugreifen obj
vom Anrufer. Anstatt einen Getter zu verwenden:
Odp other = (Odp) obj;
if (! other.getCollection().contains(ftw)) {
}
Ich kann einfach direkt auf das Feld zugreifen:
Odp other = (Odp) obj;
if (! other.collection.contains(ftw)) {
}
Ist diese schlechte Praxis?
Lösung
Nein, ist es nicht. Der Grund, warum private Variablen und Methoden nicht aus anderen Klassen zugegriffen werden können zu einem Wert, den es nie haben soll).
Wenn Sie private Variablen anderer Objekte verwenden, die nichts schaden. Wenn Sie die Interna Ihrer Klasse umstrukturieren, müssten Sie den Code trotzdem in der Klasse ändern.
Andere Tipps
Ich neige dazu, immer Getter zu verwenden, weil ein Getter manchmal nicht nur "zurückkehren (foo)" ist. Manchmal initialisieren sie Dinge, wenn sie null sind, oder haben ein Debug -Anmelden in sich oder validieren den aktuellen Zustand in irgendeiner Weise. Es ist konsistenter.
Ich denke nicht, dass dies eine schlechte Praxis ist, sondern ein Merkmal der Sprache. Es ermöglicht Ihnen nicht nur das Testen equals
Die Art und Weise, wie Sie es tun, ist aber auch in einem Prototyp -Muster für die Objekterstellung nützlich.
Das ist in Ordnung und ganz normal. Es ist ein bisschen seltsam, das zu denken this
kann mit den privaten Feldern von herumspielen other
, aber es ist in Ordnung, weil es auf keinen Fall etwas Schlimmes passieren kann, wenn es an Dritte passieren kann, mit einem zu muken Odp
Die Interna des Objekts. Jede Methode der Odp
Die Klasse kann alle privaten Mitglieder aller ändern Odp
Objekt sogar nichtthis
Eins, aber das ist in Ordnung, da solche Methoden offensichtlich vertrauenswürdig sind!
Dies ist eine Duplizierung von
Private Daten sind durch jede Instanz dieser Klasse zugänglich, auch wenn eine Instanz der Klasse A auf die privaten Mitglieder einer anderen Instanz von A zugreifen wird. Es ist wichtig, sich daran zu erinnern, dass Zugangsmodifikatoren (privat, geschützt, öffentlich) den Klassenzugriff kontrollieren, nicht der Klassenzugriff, nicht Instanzzugriff
Die Verwendung eines privaten Mitglieds für Entity -Klasse kann eine fälschliche Arbeit der Proxy -Klasse verursachen. Stellen Sie sich vor, der Hibernate erstellen Klasse von Lazy Query. Wenn Sie die Mitgliedervariable überprüfen, gibt es NULL zurück. Wenn Sie jedoch Get () anrufen, wird Daten aus der Datenbank abgerufen und das Feld initialisiert.