Singleton v jave – Java – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Singleton v jave – Java – Fórum – Programujte.comSingleton v jave – Java – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené — příspěvek s řešením.
sleepy0
Stálý člen
26. 11. 2012   #1
-
0
-

Dobry den,

chcel by som sa opytat, ci neexistuje nejaky elegantny workaround, ked vytvaram singleton, ktory v konstruktore vytvara class uz volajuci dany singleton. Nieco taketo: 

class Singleton{
	private Singleton INSTANCE;
	private Object obj;
	private ClassUsingSingleton classUsingSingleton;
	private Singleton(){
		obj = new Object();
		classUsingSingleton = new ClassUsingSingleton();
	}

	public Singleton getInstance(){
		if(INSTANCE==null){
			INSTANCE = new Singleton();
		}
		return INSTANCE;
	}

	public Object getObject{
		return obj;
	}
}

class ClassUsingSingleton{
	final Object singletonObj;
	public ClassUsingSingleton(){
		singletonObj = Singleton.getInstance().getObject(); // Toto nieje
		// bude sa to volat do nekonecna, lebo pointer na INSTANCE je zatial null
	}
}

Alebo to ide len poslat do kostruktora, prip. ak by tam nebolo final, pouzit metodu na vytvorenie tohto classu:
 

class Singleton{
	// kod
	private Singleton(){
		obj = ...
		classUsingSingleton = new ClassUsingSingleton(obj);
	}
	//resp.
	private Singleton(){
		obj = new Object();
	}
	
	public void createClassesUsingSingletonInConstuctor(){
		// ako v predoslom priklade
		classUsingSingleton = new ClassUsingSingleton();
	}
	//kod
	//
}

Jo a s enumom je to to iste, pokial nieje vytvoreny neda sa pouzivat.

Nahlásit jako SPAM
IP: 158.195.195.–
ingiraxo+15
Grafoman
26. 11. 2012   #2
-
+1
-
Zajímavé

já nějak nerozumim o co se snažíš.. hlavně to co ty vytváříš není singleton, ale normální třída s instancí sebe sama

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Řešení
RePRO0
Super člen
26. 11. 2012   #3
-
+2
-
Zajímavé
Vyřešeno Nejlepší odpověď

Zdravím,

sleepy, jdeš na to dobře, ale... co třeba klíčové slovo static? To je dosti důležité při použití Singletona... ;)

Klasický postup je takový, že u té metody getInstance() hodíš teda static. Potom samozřejmě uděláš privátní konstruktor a kopírovací konstruktor (klon), aby nemohla být vytvořena instance jiným způsobem. ;)

Stačí takto:

private Singleton() { }
Nahlásit jako SPAM
IP: 95.82.185.–
Software: C; C++; C#; Pascal; Delphi; Java Webdesign: PHP; MySQL; CSS; jQuery; Ajax; Javascript; OOP
sleepy0
Stálý člen
27. 11. 2012   #4
-
0
-

#3 RePRO
Aha dakujem, uz som si to vsimol. Ale teraz este k tej druhej otazke. Ten class co pouziva objekt z daneho singletonu, ked ho vytvaram, nemusi byt vytvoreny len raz a vytvara si ho aj sam sigleton. Lenze ako som sponul vyssie, nemozem napisat  

private Singleton(){
	obj = new Object();
	classUsingSingleton = new ClassUsingSingleton();
}

tam sa mi to zacne cyklit, lebo class using singleton ziskava objekt, ktory vytvoril Singleton pomocou Singleton.getInstance().getObject(). Napadlo ma v ClassUsingSingleton pouzit dva kostruktory, jeden co by vytvoril dany class v singletone a druhy co by sa dal pouzivat mimo daneho, ale toto riesenie sa mi moc nepaci, neda sa to jednoduchsie?

Nahlásit jako SPAM
IP: 158.195.195.–
Dano
~ Anonymní uživatel
101 příspěvků
27. 11. 2012   #5
-
+1
-
Zajímavé

#4 sleepy
V akej suvislosti chces dany singlton pouzit? RePRO to spravne napisal, ze tymto navrhovym vzorom zabezpecis to, ze v aplikacii bude existovat instancia danej triedy iba raz. Napriklad instancia servisnej triedy.

To o co sa snazit Ty je 'zbastardeny' singlton a povedal by som skor, ze je to trieda s privatnym konstruktorom. Singlton nema co riadit vznik ostatnych tried okrem seba samej.

Nahlásit jako SPAM
IP: 195.28.127.–
sleepy0
Stálý člen
27. 11. 2012   #6
-
0
-

#5 Dano
Ok dik za radu. Asi to prerobim tak.

Nahlásit jako SPAM
IP: 158.195.195.–
RePRO0
Super člen
27. 11. 2012   #7
-
0
-

Na co tu druhou třídu? Normálně si vytvoříme metodu main, a do ní se to zkusí:

public static void main(String[] args) 
{
	Singleton s1, s2, s3;
	s1 = Singleton.getInstance();
	s2 = Singleton.getInstance();
	s3 = Singleton.getInstance();
}
Nahlásit jako SPAM
IP: 95.82.185.–
Software: C; C++; C#; Pascal; Delphi; Java Webdesign: PHP; MySQL; CSS; jQuery; Ajax; Javascript; OOP
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 5 hostů

Podobná vlákna

O Jave — založil echo112

Notepad v javě — založil Anonymní uživatel

Databáze v Javě — založil Martin

Programovanie v jave — založil is640kp

Hudba v Jave — založil ospaly.stanislav

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý