In Java Konstanten einander zuordnen

OP #3729978
Lesenswert?

Hallo zusammen,

ich habe in meinem Projekt zwei Sätze von Konstanten, die ich einander 
zuordnen möchte. Ich habe auch schon eine Möglichkeit wie es geht, da es 
aber mein erstes größeres Java-Projekt ist wollte ich einfach mal fragen 
ob es vielleicht eine elegantere Lösung gibt.

Um  das Problem verständlicher zu machen habe ich mal ein einfaches 
Beispiel konstruiert:
Angenommen ich habe eine Klasse "Color" und eine Klasse "Farben" die 
jeweils Frabbezeichnungen in englisch und deutsch enthalten. Mein Code 
um die einander zuzuordnen wäre wie folgt:
1
public class Translator{
2
   public static String en2de (String color){
3
      if (color.equals(Color.red))
4
         return Farbe.rot;
5
      
6
      if (color.equals(Color.blue))
7
         return Farbe.blau;
8
   
9
      return null;
10
   }
11
}

Bin offen für konstruktive Beiträge =)
#3730028
Lesenswert?

Robert B. schrieb:
> Ja man könnte Übersetzungsfunktion dazu sagen. Die Konstanten
> gehören zu
> jeweils unterschiedlichen Schnittstellen, deren Bedeutung ist aber an
> sich gleich. Nur eben, dass die eine Schnittstelle nichts mit den
> Ausdruck der anderen Schnittstelle anfangen kann.

Versuch es doch mit zwei java.util.Map : de2en und en2de . Oder einer 
bidirektionalen Map, die gibt es aber nicht in den Standard-Libs von 
Java.
#3730301
Lesenswert?

Robert B. schrieb:
> Meinst du sowas?
>
1
> public class colorMap implements Map {
2
>   public colorMap() {
3
>     this.put("Color.red", "Farbe.rot);
4
>   }
5
> }
6
>
>
> (Habe es jetzt nicht auf Funktionsfähigkeit geprüft, nur schnell aus dem
> Kopf hingetippt ;))

eher:
1
public class ColorMapping {
2

3
  public static final Map<Farbe,Color> De2En;
4
  public static final Map<Color,Farbe> En2De;
5

6
  static {
7
    De2En= new HashMap<Farbe,Color>();
8
    De2En.put(Farbe.rot, Color.red);
9
    De2En.put(Farbe.blau, Color.blue);
10
    ...
11

12
    En2De= new HashMap<Color,Farbe>(De2En.size);
13
    for( Map.Entry<Farbe,Color> entry : De2En.entrySet() ) {
14
      En2De.put( entry.getValue(), entry.getKey() );
15
    }
16
  }
17
}

(Habe es jetzt nicht auf Funktionsfähigkeit geprüft, nur schnell aus dem
Kopf hingetippt ;) )
Gast #3730330
Lesenswert?

Kürzere Initilaisierung:

    private static final Map<Color, Farbe> COLOR_MAP = 
Collections.unmodifiableMap(new HashMap<Color, Farbe>() {{
        put(Color.red,  Farbe.rot);
        put(Color.blue, Farbe.blau);
    }});
#3730489
Lesenswert?

HennesB schrieb:
> private static final Map<Color, Farbe> COLOR_MAP =
> Collections.unmodifiableMap(new HashMap<Color, Farbe>() {{
>         put(Color.red,  Farbe.rot);
>         put(Color.blue, Farbe.blau);
>     }});

Dir (und dem TO) ist aber hoffentlich klar, daß damit eine eigene 
anonyme Klasse erzeugt wird, von der dann genau eine Instanz existiert.
Ich persönlich mag diese Konstruktion überhaupt nicht.
#3730495
Lesenswert?

HennesB schrieb:
> Kürzere Initilaisierung:
>
>     private static final Map<Color, Farbe> COLOR_MAP =
> Collections.unmodifiableMap(new HashMap<Color, Farbe>() {{
>         put(Color.red,  Farbe.rot);
>         put(Color.blue, Farbe.blau);
>     }});

Das sollte man meiden.

Man erzeugt eine anonyme Subklasse (und Instanz) von HashMap, kann ganz 
schoen nach hinten los gehen wenn man nicht genau daruber im klaren ist 
was da passiert.

Mit Google guava wuerde das so aussehen:

private static final Map<Color, Farbe> COLOR_MAP = 
ImmutableMap.of(Color.red, Farbe.rot, Color.blue, Farbe.blau);

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren