/ 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
2 problemer
Fra : Ulrik Magnusson


Dato : 14-02-01 23:46

Hej alle

Jeg har følgende problem:

En bunke id'er som skal bruges i switch sætninger.
En toString() metode, der skal returnere "navnet" på id'et.

Id'erne repræsenteres altså som fx
static final int JUMP;
toString() skal returnere "JUMP".

Jeg kan gøre det med reflection, men det er jeg ikke helt glad for, så
jeg ville høre
om der var nogle gode forslag til en mere elegant og umiddelbar (og
hurtig) løsning?

Her er min reflection løsning:

import java.lang.reflect.*;

class Instruction
{
static int JUMP = 0;
static int STORE = 1;
// etc
static int SUB = 1201;
static int ADD = 1202;

private int id;

public Instruction( int id )
{
this.id = id;
}

public String toString()
{
try
{
Field[] fields = getClass().getDeclaredFields();
for( int i = 0; i < fields.length; i++ )
{
if( ((Integer)fields[i].get(null)).intValue() == id )
{
return fields[i].getName();
}
}
}
catch( IllegalAccessException e )
{
}
return null;
}

}

Ulrik Magnusson


--
DEUTSCH: You two have some sick sex thing?
BARTON: Sex?! He's a MAN! We WRESTLED!
Barton Fink - Joel and Ethan Coen, 1991
Visit my home page: http://www.geocities.com/ulrikm



 
 
Ulrik Magnusson (14-02-2001)
Kommentar
Fra : Ulrik Magnusson


Dato : 14-02-01 23:47

Ulrik Magnusson wrote:

> Hej alle

ok, så ét problem, da!

Ulrik Magnusson


--
DEUTSCH: You two have some sick sex thing?
BARTON: Sex?! He's a MAN! We WRESTLED!
Barton Fink - Joel and Ethan Coen, 1991
Visit my home page: http://www.geocities.com/ulrikm



Rene Hangstrup Moell~ (15-02-2001)
Kommentar
Fra : Rene Hangstrup Moell~


Dato : 15-02-01 14:28

On Wed, 14 Feb 2001, Ulrik Magnusson wrote:

> Jeg har følgende problem:
> En bunke id'er som skal bruges i switch sætninger.
> En toString() metode, der skal returnere "navnet" på id'et.

Såfremt der ikke er alt for mange huller i din id-sekvens,
er et simpelt string-array måske løsningen.

String[] name = {"JUMP", "STORE",,,,,"SUB","ADD"}

Og i stedet for toString skriver du bare name[id]

---
Rene Hangstrup Møller || http://WebCafe.dk - Dansk side om webdesign.


Ulrik Magnusson (15-02-2001)
Kommentar
Fra : Ulrik Magnusson


Dato : 15-02-01 15:35

> Såfremt der ikke er alt for mange huller i din id-sekvens,
> er et simpelt string-array måske løsningen.
> String[] name = {"JUMP", "STORE",,,,,"SUB","ADD"}
> Og i stedet for toString skriver du bare name[id]

Så kan jeg bare ikke bruge id'et i switches - som fx

switch( instruction.id )
{
case Instruction.JUMP:
{
//...
}
}

(Problemet er at jeg gerne vil referere til Instruction.NAME som final
int og
instruction.toString() som String uden at skulle lave en eksplicit
"mapping",
NAME => "NAME")

Ulrik Magnusson


--
"Look! Ducks in the lake"
'Agent Cooper' in Twin Peaks - Lynch, 1990
Visit my home page: http://www.geocities.com/ulrikm



Peter Lind (15-02-2001)
Kommentar
Fra : Peter Lind


Dato : 15-02-01 15:39


"Rene Hangstrup Moeller" <rmoller@control.auc.dk> wrote in message
news:Pine.GSO.4.21.0102151419300.17057-100000@flovmand.control.auc.dk...
> On Wed, 14 Feb 2001, Ulrik Magnusson wrote:
>
> > Jeg har følgende problem:
> > En bunke id'er som skal bruges i switch sætninger.
> > En toString() metode, der skal returnere "navnet" på id'et.
>
> Såfremt der ikke er alt for mange huller i din id-sekvens,
> er et simpelt string-array måske løsningen.
>
> String[] name = {"JUMP", "STORE",,,,,"SUB","ADD"}
>

Og hvis der er mange huller i din id-sekvens, kunne løsningen måske være at
lægge id og name ind i et Map, f.eks. Hashmap.
id skal følgelig konverteres til et objekt, Integer eller String, men det
burde ikke volde for meget besvær. Måske du kunne gemme id som en Integer
fra start.

din toString bliver så til

return (String)mymap.get( (Integer) id );

-

Med venlig hilsen
Peter Lind
-der allerede tror at han har gættet at du er ved at lave en dissassembler
af en art.



Ulrik Magnusson (15-02-2001)
Kommentar
Fra : Ulrik Magnusson


Dato : 15-02-01 15:43

> Og hvis der er mange huller i din id-sekvens, kunne løsningen måske være at
> lægge id og name ind i et Map, f.eks. Hashmap.

Så skal jeg bare lave en eksplicit "mapping", NAME => "NAME" (hvilket
jeg gerne vil undgå..).

> Med venlig hilsen
> Peter Lind
> -der allerede tror at han har gættet at du er ved at lave en dissassembler
> af en art.

Jepper. (en decompiler, faktisk)

Ulrik Magnusson

--
"Look! Ducks in the lake"
'Agent Cooper' in Twin Peaks - Lynch, 1990
Visit my home page: http://www.geocities.com/ulrikm



Ulrik Magnusson (15-02-2001)
Kommentar
Fra : Ulrik Magnusson


Dato : 15-02-01 16:25

Ulrik Magnusson wrote:

> Hej alle
>
> Jeg har følgende problem:
>
> En bunke id'er som skal bruges i switch sætninger.
> En toString() metode, der skal returnere "navnet" på id'et.
>
> Id'erne repræsenteres altså som fx
> static final int JUMP;
> toString() skal returnere "JUMP".

Implementationen som jeg gerne vil undgå ser sådan ud:

class Instruction
{
public static final int JUMP = 0;
public static final int STORE = 1;
//etc
public static final int ADD = 1000;

private static Hashtable nameTable = new Hashtable();

static // copy & paste kode følger
{
nameTable.put( new Integer(JUMP), "JUMP" );
nameTable.put( new Integer(STORE), "STORE" );
// etc
nameTable.put( new Integer(ADD), "ADD" );
}

private Integer id;

public Instruction( Integer id )
{
this.id = id;
}

public String toString()
{
return (String)nameTable.get( id )
}
}

Ulrik Magnusson

--
"Look! Ducks in the lake"
'Agent Cooper' in Twin Peaks - Lynch, 1990
Visit my home page: http://www.geocities.com/ulrikm



Filip Larsen (15-02-2001)
Kommentar
Fra : Filip Larsen


Dato : 15-02-01 18:29


Ulrik Magnusson skrev

> Implementationen som jeg gerne vil undgå ser sådan ud:
>
> class Instruction
> {
> public static final int JUMP = 0;
> public static final int STORE = 1;
> //etc
> public static final int ADD = 1000;
>
> private static Hashtable nameTable = new Hashtable();
>
> static // copy & paste kode følger
> {
> nameTable.put( new Integer(JUMP), "JUMP" );
> nameTable.put( new Integer(STORE), "STORE" );
> // etc
> nameTable.put( new Integer(ADD), "ADD" );
> }
>
> private Integer id;
>
> public Instruction( Integer id )
> {
> this.id = id;
> }
>
> public String toString()
> {
> return (String)nameTable.get( id )
> }
> }

Umiddelbart kan jeg komme på tre måder at gøre det på:

1) Manuelt indskrive alle "final static int" og lade reflection om at fylde dit toString map ud. Det er vist den du startede med.

2) Manuelt indskrive dine konstanter som
final static Instruction JUMP = new Instruction(...);
og så bruge fx. strategi pattern i stedet for switch. En meget OO løsning, men måske ikke særlig praktisk.

3) Skrive dine instruktioner i "et andet sprog", fx. XML, og lav en lille kodegenerator der læser denne og generere Instruction.java filen.


Hvis jeg var dig vil jeg nok vælge første løsning :).


Mvh,
---
Filip Larsen <filip.larsen@mail.dk>



Ulrik Magnusson (15-02-2001)
Kommentar
Fra : Ulrik Magnusson


Dato : 15-02-01 19:14

> 2) Manuelt indskrive dine konstanter som
> final static Instruction JUMP = new Instruction(...);
> og så bruge fx. strategi pattern i stedet for switch. En meget OO løsning, men måske ikke særlig praktisk.

Jeg har faktisk bestemt mig for noget der ligner.
Jeg dropper kravet om "switch" brug, og laver en "enum klasse", Mnemonic,
som Instruction konstrueres med. Mnemonics konstruktor tager navnet på
variablen som argument, og jeg undgår dermed ikke kode som dette:

public static final Mnemonic JUMP = new Mnemonic("JUMP");
public static final Mnemonic STORE = new Mnemonic("STORE");
// etc
public static final Mnemonic STORE = new Mnemonic("STORE");

Jeg synes dog, løsningen er ret pæn i alle andre henseender, så det går nok..

Koden er nedenfor.

Tak for forslagene alle sammen.
Ulrik Magnusson



public class Instruction
{
private Mnemonic mnemonic;

public Instruction( Mnemonic mnemonic )
{
this.mnemonic = mnemonic;
}

public Mnemonic getMnemonic()
{
return mnemonic;
}

public String toString()
{
return mnemonic.toString();
}

}

final class Mnemonic
{
public static final Mnemonic JUMP = new Mnemonic("JUMP");
public static final Mnemonic STORE = new Mnemonic("STORE");
//etc
public static final Mnemonic ADD = new Mnemonic("ADD");

private String name;

private Mnemonic( String name )
{
this.name = name;
}

public String toString()
{
return name;
}

}

--
"Look! Ducks in the lake"
'Agent Cooper' in Twin Peaks - Lynch, 1990
Visit my home page: http://www.geocities.com/ulrikm



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

Månedens bedste
Årets bedste
Sidste års bedste