Java Switch Anweisung und Konstanten

transdenzentral

Lt. Junior Grade
Registriert
Sep. 2007
Beiträge
384
Moin,

ich bin z.Z. dabei Java zu erlernen. Allerdings stellt sich mir gerade folgende Frage.

Kleines Beispiel:

Ich deklariere zwei Konstanten in Klasse a mit der Sichtbarkeit "public":

public static final int OBEN = 0;
public static final int UNTEN = 1;

Jetzt möchte ich auf diese Konstanten in der anderen Klasse b innerhalb einer Switch-Anweisung zugreifen, nach dem Motto:

Code:
  switch (Anweisung die "zufällig" 0 oder 1 ausspuckt) 
     {
            case a.OBEN: 
                             Anweisungen
            break;
            case a.UNTEN:
                             Anweisungen
            break;

            usw.

Als Fehler bekomme ich jetzt "constant expression required", was klar ist, weil nach der Case Anweisung ein konstanter Wert folgen muss.

Was ich jetzt nicht verstehe ist, warum dies geschieht? Die Variablen sind als Konstanten vereinbart. Erfordert die Switch also einen definierten Ausdruck wie 1 2 3 4 ?

Kann ich das irgendwie sauber umgehen ?
 
Hab lang nicht mehr programmiert, aber musst du nicht erst Klasse a in Klasse b importieren?
 
Wo jetzt?
Als Beispiel sieht das momentan so aus:

Code:
public void testMethode(a test)
switch(zufallsZahl(2))
 {

            case test.OBEN: 
                             Anweisungen
            break;
            case test.UNTEN:
                             Anweisungen
            break;

Die Methode zufallsZahl(2) spuckt jetzt entweder die Integer Zahl 0 oder 1 aus, also keine Variable ganz oben.

Wohingegen im Case-Teil dann die als Konstanten deklarierten Variablen aufgerufen werden sollen, was ja nicht funktioniert :) - die Frage ist jetzt, woran liegt das? Kann die Switch Anweisung nur konkrete Werte der primitiven Datentypen verwerten?


@eins über mir:
Am "Importieren" wirds nicht liegen, ein Objekt der Klasse a, die die Konstante enthält, wird in der oben genannten Methode als Paramter mitgegeben. Wenn man sich eine normale int Variable bauen würde und das irgendwo ausgibt, passt das schon.
 
Zuletzt bearbeitet:
Vielleicht muss der switch Anweisung eine Konstante übergeben werden wenn du in der switch Anweisung Konstanten auswertest?

MfG
 
Du benutzt ja eine Variable, nämlich test. Um auf die static Konstanten zuzugreifen musst du den Klassennamen benutzen (und gewöhne dich schon mal daran Klassennamen mit Großbuchstaben zu beginnen):

Beispiel

Code:
class A {
public static final int OBEN = 0;
public static final int UNTEN = 1;

}

public class Main {

  public static void main(String[] args) {
    switch ((int)Math.random()) {
      case A.OBEN:
        break;
      case A.UNTEN:
        break;
      default:
        break;
    }
  }

}
 
Guten Morgen,

r0b0t schrieb:

uns wurde immer beigebracht, dass sowas wie oben "unsauber" ist, wir mussten im Unterricht immer erst ein getOBEN() mit return OBEN; in A schreiben, während wir die Variablen immer private lassen mussten, ist da was dran?
 
Es macht nur Sinn, wenn du im Getter noch eine Aktion an der Variable ausführen möchtest (Konvertierung ..).
 
Das macht nicht nur Sinn wenn man noch eine Aktion auf die Variable ausführen will, sondern nennt sich Geheimnisprinzip und ist ein Grundkonzept der Objektorientierten Programmierung.

MfG
 
public class ConstDef {

public final static int WERT_0 = 0;

public final static int WERT_1 = 1;
}


public class Main {

public static void main(String[] args) {
test();
}

public static int zufall()
{
Double value = new Double(Math.random());
return (value > .5 ? 1 : 0);
}

public static void test()
{
int var = zufall();
switch(var)
{
case ConstDef.WERT_0:
System.out.println("Wert ist 0");
break;

case ConstDef.WERT_1:
System.out.println("Wert ist 1");
break;

default:
System.out.println("Wert ist undefiniert");
break;
}
}
}


du definierst statische klassenmember, auf die musst du via klassennamen zugreifen!
 
@Zeitschlag:
OBEN und UNTEN sind ja gar keine Variablen, sondern Konstanten. Wären es Variablen, hättest du recht. Zum Beispiel greift man auf die in der Standardbibliothek Math definierten Konstanten E und PI einfach mit Math.E bzw, Math.PI zu.
 
Danke für die vielen und vorallem schnellen Antworten.
Habs jetzt verstanden :)
 
Ich biete dir mal noch eine Alternative an. Das "int enum pattern" (in die Richtung geht das nämlich, was du machst mit WERT_0, WERT_1, etc.) ist nicht der Königsweg in Java. Dafür benutzt man ein "enum". Bei 2 Werten mag sich dir der Sinn noch nicht so offenbaren, aber wenn du Werte hast die offensichtlich in irgendeinem Zusammenhang stehen (im Gegensatz zu wirklich einzigartigen Werten wie PI), dann solltest du unbedingt ein enum benutzen.

Das könnte z.B. so aussehen:
Code:
    enum Constants
    {
        UNDEFINED, VALUE_0, VALUE_1;

        public static Constants constantFrom(int value)
        {
            switch (value)
            {
                case 0:
                    return VALUE_0;
                case 1:
                    return VALUE_1;
                default:
                    return UNDEFINED;
            }
        }
    }

    public static int makeRandom()
    {
        return (Math.random() > .5 ? 1 : 0);
    }

    public static void test()
    {
        int var = makeRandom();
        switch (Constants.constantFrom(var))
        {
            case VALUE_0:
                System.out.println("Wert ist 0");
                break;
            case VALUE_1:
                System.out.println("Wert ist 1");
                break;
            case UNDEFINED:
                System.out.println("Wert ist undefiniert");
                break;
        }
    }
Und gewöhne dir besser erst gar nicht an deutschen in englisch bezeichneten Code zu mischen. Ausgaben sind natürlich davon ausgenommen. ;)
 
Zuletzt bearbeitet: (makeRandom() vereinfacht)
also wenn es nur 2 zustände gibt, würde ich über nen boolean und ner if abfrage gehen...erst bei mehr als zwei zuständen oder wenn das programm prinzipiel erweiterbar sein soll an der stelle, find ich ein enom sinvoll.
 

Ähnliche Themen

Zurück
Oben