In Java Konstanten einander zuordnen

OP #3729978
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 =)
OP #3730022
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.
#3730028
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
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
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
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
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

Eine eigene Frage? Dieser Thread ist über 12 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.