2016-08-30 2 views
-3

Was ist der bessere Ansatz?Singleton Klasse oder Klasse mit nur statischen Feldern?

Nehmen wir ein Szenario an, in dem es eine Dienstprogrammklasse gibt, die von anderen Klassen verwendet wird. Was ist besser in diesem Fall zu verwenden, eine Singleton-Klasse, die genau einmal instanziiert werden kann oder sollte ich alle fieds statisch machen?

+3

Das hängt davon ab, was die Felder sind und wie sie verwendet werden. – azurefrog

+0

Ist 'weder' eine gültige Antwort? – bradimus

+0

Tatsächlich geben die OOP-Prinzipien an, dass es keine "Utility" -Klassen geben sollte, da sie rein prozedural sind. Ich rate Ihnen daher, zu versuchen, Ihre derzeitige Architektur zu überdenken. Obwohl, wenn Sie * wirklich * einige Hilfsmethoden brauchen, dann wären natürlich 'statische' Methoden besser. Singleton selbst ist auch eine Klasse mit einem bestimmten Zustand und Verhalten, während Hilfsmethoden keinen Zustand annehmen. – Scadge

Antwort

0

Bei der objektorientierten Programmierung sollten Sie möglichst Singletons und Utility-Klassen vermeiden.

Wenn jedoch wirklich benötigt, würde ich mit der Dienstklasse ohne Felder gehen - nur statische Methoden. Per Definition sollten Dienstprogramme eher aus zustandslosen Funktionen bestehen. Solche sind im Vergleich zu nicht testbarem Singleton (was mit statischem Feld gemacht wird) gut testbar. Wenn Sie den Status beibehalten müssen, gehen Sie zu echten Objekten.

Wie im Kommentar erwähnt, können Sie eine sichere Singleton durch Dependency-Injektion, ohne statischen Zustand getan haben.

+1

Singleton ist sehr gut testbar, wenn es richtig gemacht wird - d. H. Durch DI. Es sind die 'statischen' Verweise auf den Singleton, die Probleme verursachen - genau wie die' statischen' Methoden; keine Möglichkeit, sie zu verspotten. –

+0

@BoristheSpider Ich habe festgestellt, dass ich statische veränderbare Felder bedeuten :) –

+0

Ich nehme an, was Sie eigentlich meinen, ist "_do implementieren Sie nicht Ihr Singleton in einer nicht threadsafe Weise, wie es threadsafe_ nicht sein wird" - das ist offensichtlich eine Tautologie und nicht in irgendeiner Weise hilfreich. 'statische' veränderbare Felder können absolut threadsicher sein, wenn sie" flüchtig "sind oder der Zugriff" synchronisiert "ist oder eine Anzahl anderer Optionen, um sie threadsicher zu machen. –