Avatar billede clemmensen Nybegynder
06. januar 2003 - 18:43 Der er 11 kommentarer og
1 løsning

Singleton.. hvad og hvordan??

Vi sidder her til et lille Javaprojekt..
Vi har gang på gang hørt at singleton design metoden er vejen frem.
Men vi er ikke helt med på hvad den gør og hvornår det er smart at bruge den.
Kunne nogen give os en beskrivelse af hvordan og hvornår man bruger den.. Samtidig ville det være rart med et eksempel..

Her er et eksempel på vores ene klasse:

/*
* Ingredient.java
*
* Created on 6. januar 2003, 12:34
*/

/**
*
* @author  OS
*/
import java.util.LinkedList;
import java.util.Iterator;

public class Ingredient{
   
    /** Instance variables for this class.*/
    private String name;
    private String unit;
    private double qty;
    private static LinkedList allIngredient = new LinkedList();
   
   
    /** Creates a new instance of Ingredient */
       
    public Ingredient(){
    }
   
   
    public Ingredient(String n, String u, double a){
        name = n;
        unit = u;
        qty = a;
    }
   
    /** Adds the object to our allIngredient list */
    public static void addIngredientToList(Ingredient ing){
        allIngredient.add(ing);
        System.out.println(allIngredient);
    }
   
    public static void deleteIngredient(String ingredientName){
        System.out.println(allIngredient);
        Iterator entryIt = allIngredient.iterator();
        while(entryIt.hasNext()){
            Ingredient ing = (Ingredient) entryIt.next();
            if (ingredientName.equals(ing.name))
                entryIt.remove();
            System.out.println(allIngredient);
        }
    }
   
    //* Get method that returns an Ingredient object with the given name*/
    public static Ingredient getIngredient(String ingredientName){
        Ingredient a = new Ingredient();
        Iterator entryIt = allIngredient.iterator();
        while(entryIt.hasNext()){
            Ingredient ing = (Ingredient) entryIt.next();
            if (ingredientName.equals(ing.name)){
                a = (Ingredient) ing;
            }
           
            //System.out.println(allIngredient);
        }
        return a;     
    }
   
    public static LinkedList getAllIngredient(){
        LinkedList per = new LinkedList();
        Iterator entryIt = allIngredient.iterator();
        while(entryIt.hasNext()){
            Ingredient ing = (Ingredient) entryIt.next();
            per.add(ing);
           
        }
        System.out.println(per);
        return per;
    }
       
   
    public String getName(){
        return name;
    }
   
    public String getUnit(){
        return unit;
    }
   
    public double getQty(){
        return qty;
    }
   
   
}

Klassen Ingredient indeholder alle ingredienser i vores lille husholdnings-system :) Vi har valgt at gemme disse objekter i vores "static LinkedList allIngredient".. Dette betyder desværre at vi får en del statiske metoder hvilket man vel egentlig burde undgå? Kan singleton rette op på dette?
Avatar billede riversen Nybegynder
06. januar 2003 - 18:46 #1
Avatar billede riversen Nybegynder
06. januar 2003 - 18:48 #2
om det er vejen frem kommer jo an på hvad man vil, men vil du sikre at der altid kun findes EN instans af en klasse så er det singleton du skal have fat i...altså alle objekter arbejder altid med den samme instans af klassen.
Avatar billede jakoba Nybegynder
06. januar 2003 - 19:08 #3
hvorfor er det skidt at have en masse statiske funktioner ?
Avatar billede clemmensen Nybegynder
06. januar 2003 - 19:26 #4
Fordi det gør programmet svært at gennemskue samtidig med at det giver en høj kobling mellem klasserne.
Avatar billede jakoba Nybegynder
06. januar 2003 - 19:38 #5
joe, såmænd
Avatar billede clemmensen Nybegynder
06. januar 2003 - 20:39 #6
Flere bud?
Avatar billede carstenknudsen Nybegynder
06. januar 2003 - 21:13 #7
En singleton pattern betyder bare at en klasse kun kan
eksistere i en enkelt instans. En simpel implementering
er som følger:
public class Singleton {
private static final Singleton unique = new Singleton();
private Singelton();
public static Singleton getInstance() {
  return unique;
}
private Object readResolve() throws ObjectStreamExeption {
  return unique;
}
}
I jeres eksempel er det næppe interessant med en
sigleton pattern da I skal have mange ingredienser.
Avatar billede carstenknudsen Nybegynder
06. januar 2003 - 21:13 #8
Der skulle have stået
private Singleton(){}
Avatar billede arne_v Ekspert
07. januar 2003 - 16:36 #9
Normalt koder man en singleton som:

public class X {
  private X instance = null;
  private X() {
      // whatever
  }
  public static getInstance() {
      if(instance == null) {
            instance = new X();
      }
      return instance;
  }
  // ovrige metoder
}

Og normalt er det nok til at sikre kun en instans
af objektet (men ikke altid - classloadere !).

Du kan lave ting med et singleton objekt som du ikke
kan lave med en klasse med ene statiske metoder.

En singleton er OO programmering.

En klasse med ene statiske metoder er gammeldags
procedural programmering.
Avatar billede jakoba Nybegynder
07. januar 2003 - 16:50 #10
bør funktionen  getInstance  ikke låse sig selv så en anden tråd ikke kan kalde den igen før første kald er kørt til ende?
Avatar billede arne_v Ekspert
07. januar 2003 - 18:25 #11
Det har jeg faktisk aldrig tænkt på. Koden er taget direkte
fra GoF.

Men de bruger jo C++ og standard C++ har jo ikke nogen løsning
på det problem.

Umiddelbart vil jeg give dig ret. Hvis app er multithreaded og
hvis constructoren ikke returnerer det samme hver gang, så lyder det som en
god ide at synchronisere.
Avatar billede arne_v Ekspert
12. januar 2003 - 21:47 #12
Jeg har spurgt lidt omkring og en jeg kender (en sydafrikaner
der arbejder for et fransk firma som leverer folk til et
projekt det firma jeg arbejder for leverer til en kunde i england)
fandt følgende:

http://www-106.ibm.com/developerworks/java/library/j-dcl.html?dwzone=java?e

Det korte af det lange er at i et multithreaded environment
må man enten betale for synchronize d.v.s.:

public class X {
  private X instance = null;
  private X() {
      // whatever
  }
  public synchronized static getInstance() {
      if(instance == null) {
            instance = new X();
      }
      return instance;
  }
  // ovrige metoder
}

eller (hvis det er muligt !) initialisere på classload
tidspunkt:

public class X {
  private X instance = new X();
  private X() {
      // whatever
  }
  public static getInstance() {
      return instance;
  }
  // ovrige metoder
}
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