Java/Líný singleton

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

editovat

Deklarujeme 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