Designproblem - Singleton



  • Hallo,
    ich wollte mal eine grundsaetzliche Frage zum Design eines meiner Programme stellen. Ich habe ein Program geschrieben, welches ein paar Buttons, Labels, etc hat, deren Namen habe ich in einem separaten Objekt, namens LanguageSupport.java (per getter zugaenglich) gespeichert. Dieses fungiert als Observer.
    Nun hab ich die Namen jeweils in deutsch und englisch gespeichert und kann per Funktion "setEnglisch" e.g. alles auf englisch erscheinen lassen oder anders rum alles auf D.
    Diese Klasse bzw das eine erzeugte Objekt programmweit, ist nun wiederum Bestandteil, sprich Klassenvariable von vielen meiner Klassen, die irgendwelche Widgets enthalten.

    Frage (ich hoffe es war verstaendlich erklaert):
    Ist das eigentlich sinnvoll so, da LanguageSupport (bzw dessen obj, das ich lang genannt habe nun ja sehr global ist)?
    Gibt es eine andre Moeglichkeit, wie etwa eine struct, union, was weiss ich, so etwas zu realisieren?
    Kann man das obj der Klasse LanguageSuport irgendwie zum Singelton machen, dh wie schaffe ich es, dass nur _eine_ Instanz dessen im ganzen Programm erzeugt werden darf?
    Wie koennte ich dieses Design allgemein noch verbessern (final, static, abstract,...)?



  • Hi

    sollte doch nicht schwer sein die singeltonimplementierung für java zu finden oder

    class Singelton
    {
      // static deswegen, damit nur eine instanz des klasse inerhalb deines programmes existiert auf die du zugreifst
       private static Singelton singel = new Singelton();
    
       // must be privet damit nimand sont eine weitere instanz anlegen kann!
       private Singelton() 
       {
       }
    
       // eine methode damit du an deine instanz herankommst.
       public static Singelton getInstance()
       {
           return Singelton.singel;
       }
    }
    

    aber wegen deines multilanguage suports. schau dir mal propertyfils an. Damit kann man sich auch sehr viel arbeit spahren. da geht das mit der auswahl der sprache dan voll automatisch je nach dem welche sprache der benutzer auf seinem system eingestellt hat und welche sprachen unterstützt werden. Das geht nach dem anhang am eigentlichen dateinahmen.

    gruss Termite



  • Tja, ich stehe da noch sehr am Anfang. Ich hatte schon mal Singletons gemacht allerdings ist das mom wieder einige Zeit her und momentan habe ich nichts hier (deshalb stelle ich diese Frage um nen vernuenftigen Ansatz zu bekommen und keinen eigenen Schwachsinn verwenden zu muessen - Danke Super Antwort soweit!!!)

    Ich nehme mal an, ich komm an die Elemente dann irgendwie von den Benutzerklassen aus so ran:

    class User
    ...
    private Singleton sgn;
    ...
    sgn = Singelton getInstance();
    ...
    

    Nun drehts sichs bei mir aber schon etwas im Kopf. Also ich habe eine Variable mit einer Instanz der eignen Klasse. Diese wird mit einem privaten Konstruktor von sich selber instanziiert. Der getter is "public static" also von ueberall zugaenglich. Aber wer regt dann ueberhaupt die eigene Erzeugung an?

    Also wenn ich diesen getter bediene, woher kommt der oder wann entsteht der eigentlich? Werden denn alle Klassen mit static Methoden automatisch gleich am Anfang erzeugt? Das wuerde ja heissen, dass ich ohne eine explizite Erzeugung mit new von einer der Benutzerklassen das Ding von ueberall mal eben schnell holen kann, irre???

    Andre Frage, obigen Zugang kann ich ja ueberall einbauen ohne, dass ich dann zB die Variable sgn explizit uebergeben muss - sehe ich das richtig?

    OK, das mit der Sprachunterstuetzung is nur ein Fall der imo auf ein Singleton fuehrt, mein anderes Beispiel dazu waere eine Klasse Options, die nen haufen boolean Variablen enthaelt (angewaehlte Checkboxen fuer best. Optionen), vllt gibt es da auch andere Muster fuer so nen Fall? Die Sprachunterstuetzung hab ich schon realisiert und es muss waehlbar bleiben, da das Prg auf nem Computer laufen soll, der mehreren Leuten eines internationalen Teams zugaenglich sein soll.



  • Hi

    das mit dem zugrifg hast du richtig verstanden.

    klassenelemente ( damti mein ich die statischen, die in allen instancen der klasse gleich sind ) werden beim importieren einer Class eingerichtet. man kann so gar einen art klassenkonstruktor schreiben, der beim import aufgerufen wird. ( war glaub ich static {}; oder so )

    wenn dir das new direckt bei der variable nicht gefällt, kannst du es auch auf null initallisieren. und dann beim get instace darauf prüfen. wenn null instanz anlegen. wenn nicht existierende instanz zurückgeben.

    das mit den propertys war nur ein vorschlag, den es sich meiner meinung nach mal rentiert anzuschauen. z.B. für zukünftige projekte. Das system greift meines wissens auf umgebungsvariablen zurück, die man auch verändern kann.

    gruss



  • Nur so nebenbei: Die Internationalisierung wird in der Regel über das I18n-Framework gemacht (http://java.sun.com/docs/books/tutorial/i18n/).



  • Also, angenommen ich wuerde einen JFrame als Singleton schreiben, wuerde die Klasse automatisch instanziiert werden, wenn ich bsp von main oder ner andern Methode einen Zeiger damit initialisiere - strange irgendwie Initialisierung erst durch Zuweisung moeglich...

    wenn dir das new direckt bei der variable nicht gefällt, kannst du es auch auf null initallisieren. und dann beim get instace darauf prüfen. wenn null instanz anlegen. wenn nicht existierende instanz zurückgeben.

    Geht das dann in Richtung "lazy evaluation"? Das hoert sich interessant an - Danke.

    Naja, das mit der Sprache hab ich eh schon soweit geschrieben - war auch mal ne Moelgichkeit mit nem Observer zu arbeiten - man findet solche Tutos auch immer nachdem man sie eigentlich gebraucht haette -> beim naechsten mal dann, 🤡


Anmelden zum Antworten