|
| 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
| |
|
|