Avatar billede jakoba Nybegynder
10. oktober 2004 - 18:05 Der er 14 kommentarer og
2 løsninger

forskel på statisk klasse og singleton ?

Hvad er egentlig forskellen udover at en singleton er mere kompliceret, og dermed 'smartere' ;(
Avatar billede erikjacobsen Ekspert
10. oktober 2004 - 18:30 #1
Jah, een forskel er at et singleton-objekt ikke behøver blive
oprettet, men kun bliver det når og hvis der er brug for det.
Avatar billede _carsten Nybegynder
10. oktober 2004 - 19:28 #2
Hvis jeg skulle prøve at give en forklaring på forskellen ville det lyde nogenlunde sådan.

Betragt et Singleton object som ét centralt access point til en global service

Du har måske en applikation hvis variabler skal initieres fra en property fil ved
opstart og bruges flere steder i systemet (baggrundsfarve, tekstfarve etc.),når du
laver det som en Singleton vil objectet kun blive instantieret én gang, selvom du
kører GlobaleVariabler.getGV().x) (ref. http://www.eksperten.dk/spm/548764) 1 million
gange og din property fil loades kun én gang, nemlig når getGV() kaldes første gang.

Din applikation kræcer måske også at brugeren skal foretage sig nogle ting, inden vedkommende
må tilgå andre dele af applikationen, dette kan nemt styres gennem en bolsk variabel
i Singleton objectet, men ville være meget vanskeligt med en statisk klasse, der default
ville initiere en bolsk værdi == false;

Bedre kan jeg nok ikke gøre det.
Avatar billede simonvalter Praktikant
10. oktober 2004 - 20:03 #3
Avatar billede jakoba Nybegynder
10. oktober 2004 - 20:12 #4
Det er rigtigt at det er nemt at lave initialiseringen kun een gang for en singleton, men det er vel egentlig ligesånemt i den statiske klasse:

private static Object laas = new Object();
private static boolean alleredeInitieret = false;
public  static void initier( initdata ) {
    if ( alleredeInitialiseret ) return;
    synchronized ( laas ) {
        if ( alleredeInitialiseret ) return;
        // ... initieringskode
        alleredeInitialiseret = true;
    }
}

mvh JakobA
Avatar billede jakoba Nybegynder
10. oktober 2004 - 20:25 #5
>> simonvalter
    takker; men jeg synes heller ikke de angiver nogen relle forskelle, blot lidt convenince i den ene eller anden retning.
Avatar billede erikjacobsen Ekspert
10. oktober 2004 - 20:27 #6
Der er intet der forhindrer dig i at kalde din
  initier( initdata )
mere end een gang. Det kan du ikke i en rigtig singleton.
Avatar billede erikjacobsen Ekspert
10. oktober 2004 - 20:28 #7
Nå ok, det gør din boolean ;)
Avatar billede erikjacobsen Ekspert
10. oktober 2004 - 20:29 #8
Men som du selv er inde på, så er det "convenience", og sikkerhed
for at man husker det der skal til, een gang. Du kunne fx glemme
at kalde initier( initdata )  ;)
Avatar billede _carsten Nybegynder
10. oktober 2004 - 21:02 #9
Avatar billede jakoba Nybegynder
10. oktober 2004 - 22:52 #10
Nu er vi ved at komme nogenvegne,
Inheritance argumentet er godt og især det med 'singleton-pools' hvor singleton ideen imiddelbart kan udvides til en 'ikke mere end N instanser af den klasse' pulje, med en static klasse er der nødvendigvis kun en.

takker, vil nogen lægge et svar eller skal vi vente i håb om at høre fra arne :)
Avatar billede arne_v Ekspert
11. oktober 2004 - 10:14 #11
public class G {
  public static int a;
  public static int b;
}

er dårligt fordi den ikke encapsulater a og b.

public class G {
  private static int a = 1;
  private static int b = 2;
  public static int sum() {
      return a+b;
  }
}

encapsulater men kræver early initialization.

public class G {
  private static int a;
  private static int b;
  public static void init() {
      a = 1;
      b = 2;
  }
  public static int sum() {
      return a+b;
  }
}

løser det men init kan kaldes flere gange.

public class G {
  private static int a;
  private static int b;
  private static boolean inited = false;
  public static synchronized void init() {
      if(!initied) {
        a = 1;
        b = 2;
        initied = true;
      }
  }
  public static int sum() {
      return a+b;
  }
}

løser det men tæl lige linier/tegn i forhold til:

public class G {
  private int a;
  private int b;
  private static G instance = null;
  private G() {
      a = 1;
      b = 2;
  }
  public synchronized G getInstance() {
      if(instance == null) {
            instance = new G();
      }
      return instance;
  }
  public int sum() {
      return a+b;
  }
}

der er faktisk ikke overhead ved at bruge singleton.

Og der er nogle fordele:

1)  G kan arve fra en anden klasse (det giver sjældent god kode at at arve fra G !)

2)  G kan omskrives fra singleton til "multipleton" relativt nemt

3)  Koden er mere læselig da man kan sende singleton objektet rundt på en naturlig
    måde - man kan også initiere et G objekt med ene static metoder, sende det rundt
    og kalde de static metoder på objektet, men det begynder at ligne obfuscation så !
Avatar billede jakoba Nybegynder
11. oktober 2004 - 12:40 #12
Øh, mht 'tælle linier/tegn' så er din singleton klasse altså 3 linier og 29 tegn større :-))

men derudover er vi vist ret enige efterhånden

takker til alle. kan jeg få nogen svar at acceptere!
Avatar billede jakoba Nybegynder
29. november 2004 - 20:57 #13
svar please. især carsten & arne_v
Avatar billede arne_v Ekspert
29. november 2004 - 20:59 #14
ok
Avatar billede _carsten Nybegynder
29. november 2004 - 21:01 #15
ditto !
Avatar billede jakoba Nybegynder
29. november 2004 - 21:04 #16
det var sørme hurtigth :-))  Takker
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester