Wie funktioniert das Design von Java Beans Platz mit Informationen versteckt?
-
05-07-2019 - |
Frage
Zwei Semester vor, ich hatte einen Professor, der sagte:
Einige von euch haben immer gesagt, umfassen Setter und Getter-Methoden für alle privaten Instanzvariablen. Ich sage, dass diese Information Hiding bricht, und führt oft in Systemen, in denen Invarianten kann nicht erzwungen werden.
Nun, das klingt richtig für mich. Aber schließt nicht jene Arten von Setter / Getter ein Kernteil Java Beans zu schaffen? Wenn ja warum? Wenn nicht, was bin ich Missverständnis über Java Beans?
Lösung
Getter und Setter sind nicht in einer Java-Bean-Klasse erforderlich. Alles, was erforderlich ist, dass die Klasse öffentlich sein muss, muss es ein öffentliches kein Argument Konstruktor und es muss Serializable implementieren. Um jedoch für Variablen automatisch entdeckt zu werden, wenn Ihr Bean verwendet wird Du Getter und Setter nach einer Standardnamenskonvention zur Verfügung stellen muss (getVarname, setVarname ...).
Auf jeden Fall möchten Sie von außen sichtbar nur die Variablen machen, die ein Geschäft außerhalb Ihrer Klasse gesehen zu werden.
Andere Tipps
Sie möchten können Sie unter Warum Getter und Setter Methoden sind böse :
Sie könnte einwenden, indem er sagte: „Aber was über Java Beans?“Was ist mit ihnen? Sie sicherlich kann Java Beans bauen, ohne Getter und Setter. Das
BeanCustomizer
,BeanInfo
undBeanDescriptor
Klassen existieren für genau diesen Zweck. die JavaBean spec Designer warf die Getter / Setter Idiom in das Bild, weil sie dachte, es wäre ein einfacher Weg sein, schnell eine bohnen etwas machen können Sie tun, während Sie lernen, wie man es tun richtig. Leider niemand getan.Accessoren wurde nur als eine Möglichkeit geschaffen zu markieren, eine bestimmte Eigenschaften so UI-Builder-Programm oder ein gleichwertiges könnte identifizieren sie. Sie sollen nicht nennen diese Methoden selbst. Sie gibt es für ein automatisiertes Tool zu verwenden. Dieses Tool verwendet die APIs Selbstbeobachtung in der
Class
Klasse, die Methoden zu finden und extrapolieren die Existenz gewisse Eigenschaften von dem Verfahren Name. In der Praxis wird diese Idiom Selbstbeobachtung Basis hat nicht ausgearbeitet. Es ist der Code in beträchtlichem Ausmaß gemacht zu kompliziert und verfahren. Programmierer, die keine Daten verstehen Abstraktion nennen tatsächlich die Accessoren, und als Folge davon, die Code ist weniger wartbar.
Es ist in der Regel recht einfach, man Setter / Getter für die Variablen setzen Sie nach außen sichtbar machen müssen, und Sie müssen nicht Setter / Getter für Variablen niemand sonst jedes Unternehmen haben zu wissen, über belichten.
Ihr Professor ist richtig. Sie wollen nicht blind Getter und Setter für alle Instanzvariablen erstellen. Sie wollen, dass sie schaffen, wo sie benötigt werden.
Wenn Sie eine BankAccount
-Klasse mit einer balance
Instanzvariable haben, Erstellen von Getter und Setter für es sinnvoll, wenn Sie in der Lage sein wollen, das Gleichgewicht zu überprüfen und einzustellen.
Auch hier gibt es Informationen versteckt - in Form der Umsetzung der Verkapselung. Der Getter „double getBalance()
“ könnte einfach den Wert des zugrunde liegenden Instanz-Variable zurück, wenn es dich um eine double
ist, oder es könnte einen Wert von einem BigDecimal
abgeleitet zurückkehren, wenn, dass die Umsetzung Wahl für die Variable ist, oder es könnte ein Remote-Web anrufen Service und das Ergebnis zurück. So war der Getter / Setter erlaubt nach wie vor für die Umsetzung zu variieren und somit nicht Verkapselung nicht verletzt (und durch die Erweiterung, auch nicht Java Beans).
Welche Java Beans für Sie tun, ist eine Schnittstelle definieren (getXXX(), setXXX()
) für das Abrufen und Einstellung „Eigenschaften“, Attribute einer Klasse, die Benutzer in der Regel prüfen oder zu ändern möchte. Wenn Ihre Klasse Informationen hat, die nicht als „Eigentum“ betrachtet wird, gibt es keine Notwendigkeit, sie zu entlarven. Zum Beispiel, sagen wir mal, die BankAccount
Klasse eine Instanz Variable für die Validierung von Entnahmen hat. Wenn die Client-Zugriff nicht diese benötigen oder ändern, gibt es keinen Punkt in einen Getter oder Setter für sie zu schaffen.