Was ist der Vorteil von POJO?

7

In meinem Projekt habe ich eine kleine Datenstruktur Key .

%Vor%

Ja, diese Klasse ist einfach und jedes Feld ist öffentlich zugänglich.

Aber jemand hat vorgeschlagen, stattdessen POJO Stilklassen zu verwenden, aber als ich fragte, warum sie mir das nicht sagen konnten.

Meiner Meinung nach ist der Aufruf von getters und setters langsamer als der direkte Zugriff auf ein Feld.

Warum muss ich den POJO Programmierstil verwenden?

    
jackalope 05.01.2013, 14:17
quelle

5 Antworten

13

Aus Wikipedia:

  

POJO ist eine Abkürzung für Plain Old Java Object. Der Name ist gewöhnungsbedürftig   betonen, dass ein gegebenes Objekt ein gewöhnliches Java-Objekt ist, nicht ein   spezielles Objekt.

Ein POJO ist normalerweise einfach und hängt nicht von anderen Bibliotheken, Interfaces oder Anmerkungen ab. Dies erhöht die Wahrscheinlichkeit, dass dies in mehreren Projekttypen (Web, Desktop, Konsole usw.) wiederverwendet werden kann.

Wie schon jemand in den Kommentaren darauf hingewiesen hat, ist Ihr Objekt technisch gesehen bereits ein POJO, aber Sie haben speziell nach Getter und Setter gefragt, die eher JavaBeans ähneln.

Es gibt eine Reihe von Gründen, die ich mir für die Verwendung von Getter und Setter vorstellen kann:

  1. Möglicherweise möchten Sie nur einige der Werte (I.E. read-only-Werte) abrufen . Mit Feldern können Clients die Werte direkt abrufen und festlegen. Felder können schreibgeschützt gemacht werden, wenn sie als endgültig markiert sind, obwohl dies nicht immer garantiert, dass sie unveränderlich sind (siehe Punkt 9).
  2. Getter & amp; Setter-Methoden ermöglichen es Ihnen, den zugrunde liegenden Datentyp zu ändern, ohne die öffentliche Schnittstelle Ihrer Klasse zu unterbrechen, wodurch sie (und Ihre Anwendung) robuster und widerstandsfähiger gegenüber Änderungen wird.
  3. Vielleicht möchten Sie einen anderen Code aufrufen, z. B. eine Benachrichtigung auslösen, wenn der Wert abgerufen oder geändert wurde. Dies ist mit Ihrer aktuellen Klasse nicht möglich.
  4. Sie stellen die Implementierung Ihrer Klasse offen, was in einigen Fällen ein Sicherheitsrisiko darstellen könnte.
  5. Java-Beans sind um POJOs herum entworfen, was bedeutet, dass wenn Ihre Klasse nicht als eine implementiert ist, kann sie nicht von bestimmten Tools und Bibliotheken verwendet werden, die von Ihrer Klasse erwarten, dass sie sich an diese bewährten Prinzipien hält.
  6. Sie können Werte anzeigen, die nicht sind, die von einem Feld I.E. berechnete Werte wie getFullName() , was eine Verkettung von getFirstName() und getLastName() ist, die durch Felder unterstützt werden.
  7. Sie können Ihren Setter-Methoden eine Validierung hinzufügen, um sicherzustellen, dass die übermittelten Werte korrekt sind. Dies stellt sicher, dass Ihre Klasse immer in einem gültigen Zustand ist.
  8. Sie können einen Haltepunkt in Ihren Gettern und Settors setzen, damit Sie Ihren Code debuggen können, wenn die Werte abgerufen oder geändert wurden.
  9. Wenn das Feld ein Objekt ist (I.E. kein primitiver Typ), dann kann der interne Zustand Ihrer Klasse durch andere Objekte modifiziert werden, was zu Fehlern oder Sicherheitsrisiken führen kann. Sie können sich vor diesem Szenario in Ihrem POJO-Getter schützen, indem Sie eine Kopie des Objekts zurückgeben, so dass Clients mit den Daten arbeiten können, ohne den Zustand Ihres Objekts zu beeinflussen. Beachten Sie, dass nicht Sie immer vor solchen Angriffen schützt, da Clients immer noch Änderungen an dem Objekt vornehmen können, auf das verwiesen wird (sofern dieses Objekt selbst veränderbar ist) kann das Feld einfach nicht auf eine andere Referenz verweisen, wenn es einmal festgelegt wurde.

Ja, der Zugriff auf oder die Einstellung der Werte über Methodenaufrufe ist möglicherweise langsamer als der direkte Feldzugriff, aber der Unterschied ist kaum bemerkbar und wird sicherlich nicht der Flaschenhals in Ihrem Programm sein.

Während die Vorteile klar sind, bedeutet dies nicht, dass Getter und Setter eine Silberkugel sind. Es gibt eine Reihe von "Problemen", die beim Entwurf realer, robuster skalierbarer Klassen zu berücksichtigen sind.

Diese Antwort auf eine sehr ähnliche Frage betrachtet einige Überlegungen im Detail beim Entwerfen einer Klasse mit Getter und Setter. Obwohl die Vorschläge relevanter sein können, abhängig von der Art der Klasse, die Sie entwickeln, E.G. Eine Klasse, die Teil einer API in einem großen System ist, im Gegensatz zu einem einfachen Datenübertragungsobjekt.

Beachten Sie auch, dass es Situationen geben kann, in denen eine Klasse mit direktem Feld vorteilhaft sein kann, z. B. wenn Geschwindigkeit oder Speicher begrenzt sind. Dies sollte jedoch nur berücksichtigt werden, nachdem Sie Ihren Code erstellt haben Engpass .

Achten Sie auch darauf, dass Sie nicht nur alle Ihrer Felder in Getter und Setter einfügen, da dies den Einkapselungspunkt wirklich vermisst.

Diese Antwort bietet eine gute Zusammenfassung der Gründe für die Auswahl eines POJO über ein JavaBean-Stilobjekt mit Gettern und Setter.

    
Benjamin Gale 05.01.2013, 14:29
quelle
5

Verwenden Sie private Klassenvariablen und öffentliche Getter und Setter, die Ihnen Encapsulation bieten.

    
Suranga 05.01.2013 14:21
quelle
3

Getter und Setter, insbesondere die einfachsten Formen, werden nur vom JIT-Compiler eingebunden und entfernen somit den Methodenaufruf-Overhead. Das klingt sehr nach voreiliger Optimierung. Wenn Sie einen Engpass bekommen, dann profilieren Sie und schauen Sie, wo es auftritt. Ich bin ziemlich sicher, dass es nicht in Immobilien Zugriffen sein wird.

    
Joey 05.01.2013 14:21
quelle
3

Holen Sie sich das Buch Effective Java.

  • In öffentlichen Klassen verwenden Element 14 Zugriffsmethoden, keine öffentlichen Felder.

Darin sagt Joshua Bloch, dass nichts mit öffentlichen Feldern in package-private oder verschachtelten Klassen verkehrt ist, rät jedoch dringend davon ab, öffentliche Klassen zu verwenden.

Er geht viel detaillierter auf das Thema ein, es ist ein großartiges Buch, ich schlage vor, dass Sie eine Kopie bekommen.

    
weston 05.01.2013 17:50
quelle
1

Stellen Sie sich vor, wenn ein anderer Programmierer Ihren Code verwendet. Wenn Sie keine Setter- und Getter-Methoden zur Verfügung stellen, kann er Ihre Variable direkt aufrufen, was sich sicher auf Ihren Code auswirkt. Und es kann zu Sicherheitsproblemen führen Indem Sie also die POJO-Klasse bereitstellen, zwingen Sie ihn, Ihre Methoden aufzurufen, anstatt Ihre Instanzvariablen direkt aufzurufen.

    
syed 02.03.2015 06:20
quelle

Tags und Links