Frage zu Singelton Objekt



  • Hallo ich habe folgende Frage :
    Ich habe eine Klasse Game und eine Singelton Klasse Gameboard.

    Im Konstruktor von Game wird DAS Objekt von GameBoard geholt. GameBoard hat einen private Konstruktor und deshalb habe ich eine static Funktion die das Objekt von GameBoard zurüc gibt.

    Nun meine Frage :
    wenn ich 2 verschiede Game Objekte erzueg, haben dann beide das gleiche GameBoard.



  • Wenn das Singleton richtig implementiert ist haben beide das selbe Objekt. Das ist ja gerade das Ziel des Singleton, dass nur eine einzige Instanz davon gibt.

    Falls du nicht sicher bist, ob das Singleton korrekt implementiert ist, dann kannst du hier ja mal den Code posten.



  • Habe für ein Projekt gearbeitet, wo oft Singleton-Muster benutzt wurde.
    Habe auch über die richtige Implementierung nachgedacht, die auch für viele Threads geeignet ist.

    Version 1:

    //..
    protected GameBoard singleInstance;
    
    public static GemaBoard instance() {
        if(singleInstance == null) {
            singleInstance = new GameBoard();
        }
        return singleInstance;
    }
    

    Version 2:

    //..
    protected GameBoard singleInstance;
    
    synchronized public static GemaBoard instance() {
        if(singleInstance == null) {
            singleInstance = new GameBoard();
        }
        return singleInstance;
    }
    

    Version 3:

    //..
    protected GameBoard singleInstance = new GameBoard();
    
    public static GemaBoard instance() {
        return singleInstance;
    }
    

    Version 4:

    //..
    protected GameBoard singleInstance;
    
    static {
        singleInstance = new GameBoard();
    }
    
    public static GemaBoard instance() {
        return singleInstance;
    }
    

    Version 1 wird meistens benutzt. Man kann sich aber leicht ein Szenario ausdenken, wo aus mehreren Threads die Methode instance() aufgerufen wird und alle kriegen verschiedene Objekte. Versionen 2-4 funktionieren bei mehreren Threads wie gewünscht. Version 3 und 4 unterscheiden sich in der Dokumentation (natürlich kommt es dadrauf an, welches Programm man zur Erstellung der Doku benutzt).



  • In den meisten Fallen sollte man 'singleInstance' dann gleich richtig kapseln und als private deklarieren.



  • Ich mach es immer so:

    private static MainFrame frame;	
    
    public synchronized static MainFrame getInstance() {
    		log.trace("Versuche \"MainFrame\" Instance zur\u00FCckzugeben.");
    		if (frame == null) {
    			log.trace("Es ist keine Instance vorhanden.");
    			frame = new MainFrame();
    			log.trace("Eine neue Instance wurde erzeugt.");
    		} else {
    			log.trace("Es ist noch eine Instance vorhanden.");
    		}
    		log.trace("Instance wird zur\u00FCckgegeben.");
    		return frame;
    	}
    




  • lottofee2012 schrieb:

    Ich mach es immer so:

    private static MainFrame frame;	
    
    public synchronized static MainFrame getInstance() {
    		log.trace("Versuche \"MainFrame\" Instance zur\u00FCckzugeben.");
    		if (frame == null) {
    			log.trace("Es ist keine Instance vorhanden.");
    			frame = new MainFrame();
    			log.trace("Eine neue Instance wurde erzeugt.");
    		} else {
    			log.trace("Es ist noch eine Instance vorhanden.");
    		}
    		log.trace("Instance wird zur\u00FCckgegeben.");
    		return frame;
    	}
    

    Das ist ja schlimmer als Twitter.


Anmelden zum Antworten