| 

.NET C# Java Javascript Exception

2
Als Datenübergabe an meine Factory Klassen verwende ich eine einfache Klasse (kein Singleton) mit nur statischen Variablen und nur statischen Gettern und Settern. Bei wiederholter Verwendung der Setter soll sicher gestellt sein, dass alle zuvor verwendeten statischen Variablen wieder auf ihren Ausgangswert zurück initialisiert werden. Ich habe gelesen, dass dazu der Aufruf eines leeren Konstruktors die vormals verwendeten statischen Variablen nicht verändert - dafür sind sie ja eben statisch.. ;-).
Instinktiv würde ich jetzt also eine Methode schreiben, die alle static Vars zurück setzt. Aber gibt es da nicht einen eleganteren Weg - den ich bisher übersehen habe??
06.01.2012
mobidat 63 1 7
3 Antworten
5
More computing sins are committed in the name of efficiency (without necessarily achieving it) than for any other single reason – including blind stupidity. (W.A. Wulf)
We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil. (Donald Knuth)
(zitiert nach Clean Code Developer)

Du solltest das nicht tun. De facto führst Du mit diesem Ansatz globale Variablen ein und verstößt damit gegen das Geheimnisprinzip. Dein Code wird schwerer lesbar, denn entweder übergibst Du an Deine Factory tatsächlich noch eine Objektinstanz (so verstehe ich Deine Frage), dann wird kein anderer verstehen, warum die Factory nicht direkt die statischen Getter aufruft, oder Du rufst die Factory ohne Parameter auf, dann sieht man nicht, wo die Daten herkommen. Obendrein handelst Du Dir Threading-Probleme ein. Mittlerweile gibt es ja auch auf mobilen Geräten Mehrkern-Prozessoren, da würde ich mir lieber nicht mutwillig so eine große Hürde gegen Parallelisierung einbauen.

Vor allem aber: der Schuß kann, was den vermeintlich gesparten Speicher angeht, leicht nach hinten losgehen. Während nämlich ein einfaches Parameter-Objekt über kurz oder lang vom Garbage Collector komplett aufgeräumt wird, bleiben Deine statischen Felder die ganze Zeit im Speicher, auch in Zeiten, in denen Du die Factory gar nicht benutzt. Und falls diese Felder keine integralen Datentypen haben, sondern andere Objekte referenzieren (z.B. ein Integer, BigDecimal oder, mit gewissen Einschränkungen, einen String), verhindern sie sogar, dass diese Objekte vom Garbage Collector beseitigt werden.

Also nimm ein einfaches Transfer-Objekt und pass auf, dass nach Gebrauch alle Referenzen darauf freigegeben werden. Wenn Du dann trotzdem Speicherprobleme bekommst, schau erst mal, wo sie wirklich herkommen. Die Chancen stehen recht hoch, dass Du dann größere Probleme hast als diese Parameterübergabe.
06.01.2012
Matthias Hlawatsch 13,2k 4 9
1
Du hattest Recht - ich habe alles umgeschrieben von Static auf Object gewechselt und dabei sogar Inkonsistenzen in der Programmlogik bemerkt, die mir beim statischen Zugriff verborgen blieben. 20 Jahre Erfahrung im prozedularen Programmieren verleiten zur "Globalisierung" von Variablen.
mobidat 11.01.2012
Danke für den Link zu CCD.
LiRo 11.01.2012
1
Wieso verwendest du static, wenn du (zumindest lese ich das aus deiner Frage) eigentlich ganz normale Objekte verwendenden möchtest?

Ok, dann kannst du nur noch eine "reset"-Methode schreiben, die alle Werte zurücksetzt:

class MeineKlasse
{
static int eineZahl;

static
{
reset();
}

static public void reset()
{
eineZahl = 7;
}

//setter, getter...
}


Die kannst du dann später zum Zurücksetzen nutzen:
MeineKlasse.reset();
06.01.2012
LiRo 1,3k 1 9
LiRo 1,3k 1 9
Ich erspare mir bei der Übergabe an die AbstractFactory Klassen die jeweiligen Objektreferenzen. Ausserdem will ich Speicher sparen (mobile Anwendung). Da die Übergabedaten nach dem Aufruf der Factory Klasse nicht mehr gebraucht werden, kann man sie danach wieder löschen. ich könnte natürlich ständig das gerade erzeugte Objekt mit "null" dereferenzieren.
mobidat 06.01.2012
Der Ansatz ist Ok - solange man primitive Variablen benutzt. Bei komplexen Objekten, muss man für das aufräumen und auslesen eine riesen Infrastruktur bereithalten - z.B. clone() überschreiben für tiefe Kopien etc. Trotzdem Danke Dir für den Hinweis!
mobidat 11.01.2012
0
bitte löschen!
06.01.2012
mobidat 63 1 7
2
Hallo mobidat,
ich möchte dich darauf hinweisen, dass diese "Antwort" auf LiRo's Antwort besser ein Kommentar zu LiRo's Antwort sein sollte.
Antworten sind hier wirklich als Antworten gedacht, und da diese nach Bewertung sortiert werden, könnte es schnell passieren, dass diese Information aus dem Zusammenhang gerissen wird.
Karill Endusa 06.01.2012
Danke - war ein Bedienfehler meinerseits - wie kann ich meine Antwort entfernen?
mobidat 06.01.2012
Das kann hier nur ein Admin, am besten den Eintrag editieren in "bitte löschen" o.ä.
LiRo 06.01.2012
... und natürlich vorher Deinen "Antwort"-Text per Edit in die Frage verschieben.
Matthias Hlawatsch 06.01.2012

Stelle deine Java-Frage jetzt!