Singleton pattern i Java

Relaterede dokumenter
Threads i Java. Denne artikel giver en introduktion til threads i Java. Den beskriver hvad tråde er og forklarer hvordan de bruges i Java

RMI introduktion. Denne artikel beskriver Java RMI (Remtote Method Invocation).

Database design for begyndere

Anvendelse af metoder - Programmering

Forskellige Java versioner

Bits, bit operationer, integers og floating point

Undtagelseshåndtering i C#

//Udskriver System.out.println("Hej " + ditfornavn + " " + ditefternavn + "."); System.out.println("Du er " + dinalder + " aar gammel!

Arkitektur for begyndere

A Profile for Safety Critical Java

Hvad er Objekter - Programmering

SWC eksamens-spørgsmål. Oversigt

XML parsning i Java. Denne artikel beskriver hvordan man parser XML i Java. Den beskriver W3C DOM, SAX og JDOM.

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 2

AAU, Programmering i Java Intern skriftlig prøve 18. maj 2007

Kursus i OOP og Java. Kursus i Objektorienteret programmering i Java

Introduktion til SQL queries

I denne artikel vil du ved hjælp af arrays kunne afrunde et decimaltal til et helt tal.

Sådan skriver du artikler til Eksperten!

Objektorienteret Programmering

METODER ARV KLASSER. Grundlæggende programmering Lektion 5

Videregående Programmering Obligatorisk opgave - 3. semester, efterår 2004

Objektorienterede metoder

IT projekt person galleri

Abstrakte datatyper C#-version

Tree klassen fra sidste forelæsning

Test af It-komponent

DM502. Peter Schneider-Kamp

Videregående programmering i Java

Ugeseddel 4 1. marts - 8. marts

University of Southern Denmark Syddansk Universitet. DM503 Forelæsning 11

Delphi - CrackMe og Keygen

Database programmerings tips

Kursus navn: Indledende programmering Kursus nr

Objektorienteret design med arv og polymorfi:

Gode praksisser og arkitekturer i Android-programmering. Android - praksisser og arkitekturer Copyright Lund & Bendsen A/S

Indledning. Hvorfor det forholder sig sådan har jeg en masse idéer om, men det bliver for meget at komme ind på her. God fornøjelse med læsningen.

Gæstebog med validering opbygget med MySQL

Udfordringer og problemstillinger. En liste over de udfordringer og problemstillinger, der er ved Java og JEE udvikling

Dag 10 Flertrådet programmering

02101 Indledende Programmering Introduktion til Eclipse

Database tips. Den forudsætter lidt kendskab til SQL men er for mindre erfarne. Denne guide er oprindeligt udgivet på Eksperten.dk

SigmaT.

Videregående Programmering for Diplom-E Noter

MySQL C API. Denne artikel beskriver hvordan man bruger MySQL C API. Der er beskrivelse af build med forskellige compilere.

Grundlæggende Programmering ITU, Efterår Skriftlig eksamen i Grundlæggende Programmering

Løsning af møntproblemet

DANMARKS TEKNISKE UNIVERSITET

Transkript:

Denne guide er oprindeligt udgivet på Eksperten.dk Singleton pattern i Java Denne artikel beskriver Singleton pattern og implementation i Java. Den forudsætter kendskab til Java men ikke til Singleton. Skrevet den 06. Mar 2009 af arne_v I kategorien Programmering / Java Historie: V1.0-12/01/2004 - original V1.1-31/01/2004 - forbedret formatering + lidt forklaringer om brug V1.2-17/02/2004 - tilføj henvisning til IBM artikel om double locking Teori Singleton pattern løser problemet med at man kun vil have en enkelt instans af en given klasse. Singleton pattern er en god objekt orienteret løsning på samme problem som løses ikke objekt orienteret via en klasse med kun static members og methods. Singleton pattern er et såkaldt GoF pattern, hvilket refererer til bogen "Design Patterns" af Erich Gamma, Richard Helm, Ralph Johnson og John Vlissides (4 forfattere = Gang Of Four = GoF). Kendetegnene ved en singleton klasse er: - public static metode getinstance - private constructor (den original GoF kode bruger protected constructor og det kan man også godt, men min erfaring er at man ikke kan arve fra en singleton klasse på fornuftig vis) Singleton bruges typisk til at indeholde en data struktur som der kun må eksistere en af p.g.a. den information den indeholder (pools, queues og den slags). Og har den fordel at man når som helst kan hente en referance til den uden at skulle sende den med over til constructor og gemme den der. Eksempel Her er et standard eksempel på en singleton klasse: public class S1 { private static S1 instance = null; private S1() {

public static S1 getinstance() { instance = new S1(); public void add(object o) { Alternativt kan den kodes som: public class S2 { private static S2 instance = new S2(); private S2() { public static S2 getinstance() { public void add(object o) { Den første form er dog mest udbredt, fordi den ligner den original GoF i C++ mere, og fordi det ikke er altid at man kan initialisere instansen på classload tidspunktet. Klassen kan bruges som følger:

public class TestS { public static void main(string[] args) { S1 a = S1.getInstance(); a.add("a"); S1 b = S1.getInstance(); b.add("b"); S1 c = S1.getInstance(); System.out.println(c.getList()); Singleton i multithreaded kontekst Bemærk at i en multithreaded kontekst bør man kode sin singleton klasse som: public class S3 { private static S3 instance = null; private S3() { public static synchronized S3 getinstance() { instance = new S3(); public synchronized void add(object o) { En meget vigtig note er at varianten med såkaldt double locking:

public class S4 { private static S4 instance = null; private S4() { public static S4 getinstance() { synchronized(s4.class) { instance = new S4(); public synchronized void add(object o) { på trods af at den umiddelbart ser smart ud ikke er thread safe i Java på trods af at den tidligere har været anbefalet forskellige steder. For detaljer om dette læs: http://www-106.ibm.com/developerworks/java/library/j-dcl.html?dwzone=java?e Andre ting man skal være opmærksom på En vigtig note er, at en singleton er unik indenfor en JVM d.v.s. at der kan sagtens forekomme flere instanser af en singleton klasse i forskellige processer (som køre i forskellige JVM's). Og p.g.a. den måde Java identificerer en klasse på, så kan der faktisk godt være flere instanser af en singleton klasse indenfor samme JVM, hvis de er loadet af forskellige classloaders. Bemærk at dette er ikke en typisk sitaution. Langt de fleste J2SE applikationer vil kun bruge en enkelt classloader. Men i J2EE verdenen bruger man hyppigt flere classloaders. Hvis du påtænker at bruge singleton i J2EE environment, så læs dokumentation om din applikations servers brug af classloaders og overvej om den er kompatibel med dine intentioner for din singelton klasse. Kommentar af simonvalter d. 16. Sep 2005 1

God artikel. double locking er thread safe fra Java SE 5 og så kan det vist nævnes at 1. initialiseres senere, 2. med det samme og er iøvrigt også thread safe. 3. kan være langsommere end 4. da der kun synkroniseres ved oprettelse af instans... skal 4. iøvrigt ikke bruge volatile på instansen? Kommentar af mercur8 (nedlagt brugerprofil) d. 21. Jan 2004 2 Fin og præcis artikel, flere gode detaljer er med. Mangler måske en kommentar om/beskrivelse af en singleton uden private constructor, så nedarvning understøttes (protected, exception kast i constructor). + Eksempler på brug (runtime, toolkit, db forbindelse etc.). Kommentar af codemon d. 01. Feb 2004 3 Godt Arne, endnu en artikel som er nem at læse, godt forklaret. Ikke alt mulig udenomssnak. Bortset fra thread-safe singeton ses ofte public final static INSTANCE... så get metoden bliver overflødig. Kommentar af digitalsoul d. 06. May 2004 4