Forum: PC-Programmierung In Java Konstanten einander zuordnen


von Robert B. (rsb89)


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

von Jan H. (j_hansen)


Lesenswert?

Also für mich sieht das komisch aus. Was willst du denn überhaupt damit 
bezwecken? Ist das einfach eine Übersetzungsfunktion zur Ausgabe? Oder 
brauchst du das für etwas anderes?

von Udo S. (urschmitt)


Lesenswert?

Was willst du erreichen?

von Robert B. (rsb89)


Lesenswert?

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.

von Achim H. (anymouse)


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.

von Robert B. (rsb89)


Lesenswert?

Meinst du sowas?
1
public class colorMap implements Map {
2
  public colorMap() {
3
    this.put("Color.red", "Farbe.rot);
4
  }
5
}

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

von Achim H. (anymouse)


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

von rakudah (Gast)


Lesenswert?

Funktioniert aber nur bei 1:1 Zuordnungen. Sollte eine Farbe mehrere 
Übersetzungen haben, schlägt die automatische Befüllung fehl.

von Robert B. (rsb89)


Lesenswert?

Danke, das werde ich ausprobieren. Diese Form kannte ich noch nicht.

von Robert B. (rsb89)


Lesenswert?

rakudah schrieb:
> unktioniert aber nur bei 1:1 Zuordnungen.

Ja es ist nur 1:1

von HennesB (Gast)


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);
    }});

von Robert B. (rsb89)


Lesenswert?

@HennesB:
Mit Absicht private? Möchte ja von verschiedenen Stellen darauf 
zugreifen.

von HennesB (Gast)


Lesenswert?

Kommt darauf an ob und wie du das in einer Klasse verpacken möchtest. Im 
einfachsten Fall machst du es einfach public.

von Udo S. (urschmitt)


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.

: Bearbeitet durch User
von Mladen G. (mgira)


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

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.