/ Forside / Teknologi / Udvikling / Java / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java
#NavnPoint
molokyle 3688
Klaudi 855
strarup 740
Forvirret 660
gøgeungen 500
Teil 373
Stouenberg 360
vnc 360
pmbruun 341
10  mccracken 320
#define og enum
Fra : Jonas Nielsen


Dato : 22-04-01 17:25

Så vidt jeg har forstået kan man ikke bruge noget der minder om #define
eller enum i Java. Hvad er så den pæneste måde at lave en variabel der
f.eks. har tilstandende authorization, transaction og update ?



 
 
Ulrik Magnusson (22-04-2001)
Kommentar
Fra : Ulrik Magnusson


Dato : 22-04-01 18:20

Jonas Nielsen wrote:

> Så vidt jeg har forstået kan man ikke bruge noget der minder om #define
> eller enum i Java. Hvad er så den pæneste måde at lave en variabel der
> f.eks. har tilstandende authorization, transaction og update ?

Den absolut pæneste (læs: sikreste) måde er at lave en "enum klasse", som
jeg kalder det:

class NoNameYet
{
static final AUTHORIZATION = new NoNameYet();
static final TRANSACTION = new NoNameYet();
static final UPDATE = new NoNameYet();
private NoNameYet()//konstruktor _skal_ være private
{}
}

Nu kan du bruge disse 3 som enum:

void doSomething( NoNameYet nny )
{
if( nny == NoNameYet.AUTHORISATION ){...}
else if( nny == NoNameYet.TRANSACTION ){...}
else if( nny == NoNameYet.UPDATE ){...}
}

Læg mærke til, at du altid er sikker på at nny er en af de 3, da der
ikke kan eksistere andre NoNameYet objekter.

Desværre kan du ikke bruge nny i et switch.

Ulrik Magnusson

--
"hvorfor er det stadig tilladt at høre klassisk musik ?"
'Mickey', dk.politik.indvandring
Visit my home page: http://www.geocities.com/ulrikm



Ulrik Magnusson (22-04-2001)
Kommentar
Fra : Ulrik Magnusson


Dato : 22-04-01 18:36

Ulrik Magnusson wrote:

> class NoNameYet
> {
> static final AUTHORIZATION = new NoNameYet();
> static final TRANSACTION = new NoNameYet();
> static final UPDATE = new NoNameYet();
> private NoNameYet()//konstruktor _skal_ være private
> {}
> }

UPS! Denne er vist bedre:
class NoNameYet
{
static final NoNameYet AUTHORIZATION = new NoNameYet();
static final NoNameYet TRANSACTION = new NoNameYet();
static final NoNameYet UPDATE = new NoNameYet();
private NoNameYet()//konstruktor _skal_ være private
{}
}

Ulrik Magnusson
--
"hvorfor er det stadig tilladt at høre klassisk musik ?"
'Mickey', dk.politik.indvandring
Visit my home page: http://www.geocities.com/ulrikm



Niels Ull Harremoës (26-04-2001)
Kommentar
Fra : Niels Ull Harremoës


Dato : 26-04-01 20:22

Det eneste problem er serialisering - du skal lige implementere din egen
readResolve hvis dine enum værdier skal kunne gemmes i en fil eller
udveksles over RMI og stadig opføre sig som forventet. Det kan desværre kun
laves i JDK 1.3. Jeg ville foreslå at udvide klassen som følger:

class NoNameYet implements Serializable
{
private final int code;
private NoNameYet(int newCode)//konstruktor _skal_ være private
{ code = newCode};

static final NoNameYet AUTHORIZATION = new NoNameYet(1);
static final NoNameYet TRANSACTION = new NoNameYet(2);
static final NoNameYet UPDATE = new NoNameYet(3);

private Object readResolve()
throws ObjectStreamException {
if (code == AUTHORIZATION.code) return AUTHORIZATION;
if (code == TRANSACTION.code) return TRANSACTION;
if (code == UPDATE.code) return UPDATE;
throw new InvalidObjectException("Invalid NoNameYet code : " +
code);
}
};

Niels Harremoës



Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408929
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste