Globale Variablen



  • Ich brauche in meinem Projekt in verschiedenen Klassen einen Zufallszahlengenerator. Das habe ich bisher so gelöst, dass ich in jeder betroffenen Klasse einen

    private static Random generator;
    

    definiert habe. Nun dachte ich mir, es währe doch vielleicht besser, einen globalen Generator für alle Klassen zu benutzen. Das gleiche Problem habe ich mit dem

    private static DecimalFormat df;
    

    in mehreren Klassen. Wenn man an dem Format was ändern will, muss man es immer gleich in mehreren Klassen ändern. Mit wurde aber von einer Lösung wie

    public class Global {
    public static Random generator;
    public static DecimalFormat df;
    }
    

    abgeraten, unter anderem wegen

    Be careful when doing this - when the Global class gets unloaded the variables will be undefined null. If you sell your app this will happen sooner or later and you keep looking for error everywhere but not there.

    Wie löst ihr sowas?



  • ... du denn das her???

    und warum sollte die Klasse nicht geladen werden... das hab ich noch nie gehört!



  • http://stackoverflow.com/questions/4646577/global-variables-in-java

    Das Argument habe ich auch nicht verstanden, aber in der zweiten Antwort wird auch davon abgeraten (ohne Begründung)...


  • Mod

    snOOfy schrieb:

    Das Argument habe ich auch nicht verstanden, aber in der zweiten Antwort wird auch davon abgeraten (ohne Begründung)...

    Da hat wohl irgendjemand einen ganz obskuren Fehler gekriegt und warnt deshalb jetzt vor der Fehlerquelle, die er fuer sich ausgemacht hat.

    Ich sehe kein ernsthaftes Problem darin, das so zu machen, wie Du es vorhast. Alternativ kannst Du das natuerlich auch alles in ein Singleton stecken. Ist eine Frage des persoenlichen Geschmacks. Generell wuerde ich Dir aber raten, nicht allzuviel global zu machen. Ich weiss nicht, wie Du debuggst, aber ich versuche immer, den Fehler moeglichst stark im Code zu lokalisieren. Wenn Du viele globale Abhaengigkeiten hast, ist das schwerer. Globale Variablen koennten zum Beispiel irgendwo ploetzlich den falschen Wert haben, weil sie an einer ganz anderen Stelle im Code geaendert wurden. Wenn so etwas dann auch noch nebenlaeufig in mehreren Threads ablaeuft, hast Du grosse Probleme, die Ursache des Fehlers zu finden.



  • Vielleicht meint er mit 'app' z.B. Android-App. Da passiert es dann tatsächlich permanent, dass die Klasse 'unloaded' wird und es Probleme geben kann.
    Allerdings kannst du ja im static-Ctor default-Werte zuweisen oder das angesprochenen Singelton nehmen.



  • Ok, danke für die Antworten, dann mach ich es mit der "Global" Klasse. Ich wollte nur verhindern, dass es hinterher unprofessionell aussieht.



  • snOOfy schrieb:

    Ok, danke für die Antworten, dann mach ich es mit der "Global" Klasse. Ich wollte nur verhindern, dass es hinterher unprofessionell aussieht.

    Globale Variablen sehen immer unprofessionell aus, egal wie du sie verpackst.

    Das liegt daran, dass nur Leute die nicht programmieren können globale Variablen benutzen.



  • Ich bin ja durchaus bereit, das zu akzeptieren. Aber dann sag mir doch bitte wie du das mit dem Zufallszahlengenerator und dem Decimalformat machen würdest, das in verschiedenen Klassen benötigt wird.



  • snOOfy schrieb:

    Nun dachte ich mir, es währe doch vielleicht besser, einen globalen Generator für alle Klassen zu benutzen.

    Und wieso denkst du das?

    snOOfy schrieb:

    Wenn man an dem Format was ändern will, muss man es immer gleich in mehreren Klassen ändern.

    Wieso brauchen all diese Klassen überhaupt das Format? Das zeigt doch, dass die Ausgabe quer über den Code verstreut ist. Kannst du nicht stattdessen direkt die ganze Ausgabe irgendwo kapseln?



  • gastantwort schrieb:

    Globale Variablen sehen immer unprofessionell aus, egal wie du sie verpackst.

    Das liegt daran, dass nur Leute die nicht programmieren können globale Variablen benutzen.

    Bullshit.



  • snOOfy schrieb:

    Ich bin ja durchaus bereit, das zu akzeptieren. Aber dann sag mir doch bitte wie du das mit dem Zufallszahlengenerator und dem Decimalformat machen würdest, das in verschiedenen Klassen benötigt wird.

    Wenn du 2 Stellen im Projekt hast die einen Zufallsgenerator und ein bestimmtes DecimalFormat brauchen, hast du offensichtlich duplizierten Code. Lösung ist also die entsprechenden Stellen im Projekt zu refactorn.


  • Mod

    gastantwort schrieb:

    snOOfy schrieb:

    Ich bin ja durchaus bereit, das zu akzeptieren. Aber dann sag mir doch bitte wie du das mit dem Zufallszahlengenerator und dem Decimalformat machen würdest, das in verschiedenen Klassen benötigt wird.

    Wenn du 2 Stellen im Projekt hast die einen Zufallsgenerator und ein bestimmtes DecimalFormat brauchen, hast du offensichtlich duplizierten Code. Lösung ist also die entsprechenden Stellen im Projekt zu refactorn.

    Ich denke, Deine Interpretation geht zu weit. 😉


Anmelden zum Antworten