Ich bin auch überrascht von der Anzahl der statischen Methoden im Spiel, aber warum nicht, wenn es gut funktioniert ...
Eigentlich stimme ich deinem Lehrer nicht zu.
Wenn ein Objekt keinen Status hat (dh globale Variablen), sondern nur Methoden enthält, bietet es Ihnen keine Vorteile, ein Objekt anstelle statischer Methoden zu verwenden. Außer wenn Sie planen, später einen Status hinzuzufügen (Status, der nicht freigegeben werden sollte) oder wenn Sie eine Schnittstelle verwenden und die Implementierung einfach wechseln möchten, ist es einfacher, statische Methoden zu verwenden ...
JDK selbst, Apache Commons oder viele Frameworks enthalten statische Methoden:
- StringUtils
- Pattern.matches (Regex, Eingabe)
----------
Eigentlich fragst du dich, was ist mit Klassen wie JPA.java:
https://github.com/playframework/play/blob/master/framework/src/play/db/jpa/JPA.java
Sie verwenden nur statische Methoden und behalten einen statischen Zustand bei. Das könnte seltsam sein, aber für mich ist es ein bisschen wie mit einem Singleton, nur dass die Methoden in einem statischen Kontext anstelle eines Objekts verwendet werden. Der Hauptunterschied besteht darin, dass Sie getInstance () nicht jedes Mal aufrufen müssen.
Ich denke, dies wurde aus Gründen der Benutzerfreundlichkeit so konzipiert, da es nicht benutzerfreundlich ist, "getInstance" aufzurufen, und es cool ist, einfach überall eine Sitzung zu erhalten (mit dem Thread verknüpft), anstatt die sessionFactory überall mit XML oder Autowiring zu injizieren. ..
Ihr Professor fordert Sie möglicherweise auf, die Verwendung von Statik zu vermeiden, da dies für Ihr Design gefährlich sein kann, wenn Sie sie nicht richtig verwenden. Beachten Sie jedoch, dass das Ersetzen statischer Methoden durch einen Singleton in vielen Fällen Ihr Design nicht verbessert. Selbst wenn Sie jetzt die Methoden für eine Instanzmethode aufrufen, werden Objekte immer noch eng miteinander verbunden ...
Vielleicht sollte eine Regel darin bestehen, die Verwendung von Statik zu vermeiden, es sei denn, Sie kümmern sich nicht wirklich um eine enge Kopplung.
In diesem Fall ist Ihr Code beim Aufrufen der Methoden JPA.xxx () eng an die JPA-Klasse des Frameworks gekoppelt. Aber ich denke nicht, dass Play so konzipiert ist, dass Sie ohne zumindest einige Nacharbeiten problemlos von einem Framework zu einem anderen wechseln können ...
Es ist ein großer Unterschied zu EJB3-Spezifikationen oder Ähnlichem: Wenn die Methoden des EJB3-Entitätsmanagers statisch sind, müssen Sie Ihren Code eng an die Implementierung koppeln, indem Sie HibernateEntityManager.xxx () oder ToplinkEntityManager.xxx () aufrufen. In diesem Fall gibt es eine gemeinsame Schnittstelle (und wir können keine statischen Methoden für Schnittstellen hinzufügen).
----------
- Diese Klasse ist nicht Teil einer Spezifikation, die in anderen Frameworks verwendet wird.
- Die JPA-Klasse hat nur eine Implementierung: die spielerische. Und sie planen wahrscheinlich nicht, einen zweiten zu machen.
- Daher scheint mir eine enge Kopplung an diese Play-Klasse, während Sie das Play-Framework verwenden, in Ordnung zu sein.