Avatar billede digitalsoul Nybegynder
06. november 2004 - 20:11 Der er 20 kommentarer og
1 løsning

Konfigurations objekt fra en fil

Er igang med at lave en mindre klient som skal koble op imod en server. Og istedet for at hardcode settings ind i klienten kunne det nok være meget smart at lave en lidt mere dynamisk løsning. Det jeg tænkte på var at have en konfigurations fil som man så læser ind i et singleton userconfig objekt, så man hele tiden har let adgang til den. (Er det forresten en smart løsning eller bør man lave det på en  anden måde?)

Men hvad skal så vælge? en alm. tekst fil eller bruge xml?

eks. på ting jeg gerne ville have læst ind i et userconfig objekt:

userid, serverip, serverport, email etc. (der kunne være flere ting)

Nogen der evt. kunne fixe et eksempel på en løsning?
Avatar billede arne_v Ekspert
06. november 2004 - 20:14 #1
Der er en klasse java.util.Properties som er der til den slags.

Den læser filer med:

key = value
key = value
key = value
Avatar billede arne_v Ekspert
06. november 2004 - 20:15 #2
Til lidt mere avancerede ting er XML godt fordi man kan have mere struktur
i en XML fil.

Men det kræver også lidt mere kode.

Jeg har skrevet en artikel om at læse XML filer fra Java.
Avatar billede digitalsoul Nybegynder
06. november 2004 - 20:16 #3
Burde nok lige nævnes at jeg ikke tidligere har arbejdet med XML.
Avatar billede arne_v Ekspert
06. november 2004 - 20:16 #4
En helt tredie mulighed var java.util.prefs pakken (forudsat at du er på Java 1.4 eller
nyere).
Avatar billede arne_v Ekspert
06. november 2004 - 20:16 #5
Mit råd vil være at starte med properties.

Det er super nemt.
Avatar billede arne_v Ekspert
06. november 2004 - 20:17 #6
p.props:

k1 = val1
k2 = val2

Properties p = new Properties();
p.load(new FilInputStream("p.props"));

og p.getProperty(k1) vil returnere val1
Avatar billede arne_v Ekspert
06. november 2004 - 20:18 #7
Den kan også nemt pakkes ind i en singleton
Avatar billede digitalsoul Nybegynder
06. november 2004 - 20:18 #8
Hvis det nu var en xml løsning, kunne du så prøve at lave et kode eksempel?

Og evt. et mindre XML dokument som eks. repræsenterede de ting jeg nævnte:
userid, serverip, serverport, email
Avatar billede digitalsoul Nybegynder
06. november 2004 - 20:18 #9
damn du svarere hurtigt :)
Avatar billede digitalsoul Nybegynder
06. november 2004 - 20:20 #10
Kunne jeg så istedet for få dig til at lave et properties eksempel?
Avatar billede arne_v Ekspert
06. november 2004 - 20:25 #11
Sagtens.

Som config singleton ?
Avatar billede digitalsoul Nybegynder
06. november 2004 - 20:26 #12
Det ville være lækkert hvis det kunne laves som en singleton.
Avatar billede arne_v Ekspert
06. november 2004 - 20:29 #13
5 minutter
Avatar billede arne_v Ekspert
06. november 2004 - 20:33 #14
import java.util.*;
import java.io.*;

public class Config {
    private Properties props;

    private static Config instance = null;

    private Config() {
        props = new Properties();
        try {
            props.load(new FileInputStream("C:\\Config.properties"));
        } catch (FileNotFoundException e) {
        } catch (IOException e) {
        }
    }

    public static Config getInstance() {
        if (instance == null) {
            synchronized (Config.class) {
                if (instance == null) {
                    instance = new Config();
                }
            }
        }
        return instance;
    }
   
    public int getN() {
        return Integer.parseInt(props.getProperty("N"));
    }

    public String getS() {
        return props.getProperty("S");
    }
   
    public static void main(String[] args) {
        System.out.println(Config.getInstance().getN());
        System.out.println(Config.getInstance().getS());
    }
}
Avatar billede arne_v Ekspert
06. november 2004 - 20:33 #15
Config.properties:

N = 123
S = ABC
Avatar billede arne_v Ekspert
06. november 2004 - 20:33 #16
og et svar
Avatar billede digitalsoul Nybegynder
06. november 2004 - 20:40 #17
Takker, var en del mere simpelt end jeg lige havde forestillet mig. Jeg vil prøve at arbejde lidt videre med det :)

Hvis jeg får lidt mere blod på tanden må jeg jo kigge på den XML artikel du har lavet.
Avatar billede digitalsoul Nybegynder
06. november 2004 - 20:54 #18
Hvorfor har du egentlig lavet en synchronized blok?
synchronized (Config.class)

En normal singleton:

    public static Config getInstance() {
        if(instance == null) {
            instance = new Config();
        }
        return instance;
    }
Avatar billede arne_v Ekspert
06. november 2004 - 21:04 #19
1)

Den skal være synchronized hvis nu den skal bruges i en en multithreaded
applikation.

2)

Jeg snuppede den version som ikke virker.

:-(

Det skulle være:

    public synchronized static Config getInstance() {
        if (instance == null) {
            instance = new Config();
        }
        return instance;
    }
Avatar billede digitalsoul Nybegynder
07. november 2004 - 20:21 #20
Kom lige til at tænke på en ting, hvad nu hvis jeg også gerne vil kunne lave ændringer til configen?
Avatar billede arne_v Ekspert
07. november 2004 - 20:24 #21
midlertidigt:
  bare lav set metoder

permanent:
  lav set metoder
  lad de set metoder kalde Properties store
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