Java/Líný singleton
< Java
K programování v Javě jistě patří programová konstrukce singleton. Ukážeme si jeho "línou" verzi, jednoduché logování do souboru.
Co to je líná inicializace a proč se používá? Líná inicializace slouží k odložení spuštění výpočetně nebo časově náročnější části kódu, což přináší zejména rychlejší start programu a někdy dojde též k celkovému urychlení programu. Celkové urychlení programu nastává zejména, když u líného kódu vůbec nenastane fáze inicializace.
Příklad
editovatDeklarujeme třídu SingletonLazy:
package wikibooks;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
/** Trida SingletonLazy provadi line logování do souboru. */
public class SingletonLazy {
private static SingletonLazy single = null;
private static String fileName = "c:/temp/log/log.txt";
private FileWriter fw;
/** Soukromy konstruktor vytvari instanci Singletonu
@throws IOException */
private SingletonLazy() throws IOException {
File file = new File(fileName);
File dir = file.getParentFile();
if(!dir.exists()) { dir.mkdirs(); } // zajistit existenci adresare pro log-soubor
if(file.exists()) { file.delete(); } // zajistit neexistenci predchoziho log-souboru
if(file.createNewFile()) { /* vytvoren novy soubor */ }
fw = new FileWriter(file.getAbsoluteFile(), true); // filewriter pro zapisy na konec souboru (append)
}
/**
Vzdy navraci jednu a tu samou instanci Singletonu, ktera pak provadi operace. Bezpecnost
cteni a zapisu promenne single, ve ktere je instance tridy, zajistuje volatile.
@return
@throws IOException */
public static synchronized SingletonLazy getInstance() throws IOException {
if(single == null) { single = new SingletonLazy(); }
return single;
}
/**
provede logovani do souboru
synchronizovano pro atomicitu operace, aby logovani bylo postupne
@param stol
@throws IOException */
public synchronized void log(String stol) throws IOException {
fw.write("\n" + stol); // zapis textu do souboru
fw.flush(); // zajistit skutecny/fyzicky zapis do souboru (vyprazdnit buffer)
}
public static void main(String[] args) throws IOException {
SingletonLazy.getInstance().log("txt3");
SingletonLazy.getInstance().log("txt4");
}
}
Po spuštění se zajistí existence uvedené cesty a souboru log.txt . V něm potom dva řádky s textem:
txt3
txt4
Odkazy
editovat- Encyklopedický článek Singleton ve Wikipedii
- Encyklopedický článek Odložené vyhodnocování ve Wikipedii