# switch-case



## Java-Problems (4. Mrz 2009)

Hallo zusammen,
wenn ich in einer switch-case anwendung im case 1 eine arraylist erzeuge und mit objekten fülle,
wie kann ich diese dann in case 2 aufrufen? geht das überhaupt?
Oder muss ich den Konstruktor außerhalb aufrufen?


----------



## ARadauer (4. Mrz 2009)

dein name alleine schon... du hast von grund auf eine negative einstellung zum thema und willst es wohl gar nicht verstehen!

jetzt mal private, public aussen vorgelassen...irgendwie ist es ganz einfach, wenn ich eine variable definiere, ist sie nach aussen nicht sichtbar, nach innen schon....
wenn ich eine object variable definiere, ist in einer methode sichtbar,
wenn ich eine variable in einer methode definiere, ist sie weiter innen, in einer schleife, swtich block sichtbar, in einer anderen methode aber nicht...
wenn ich eine nariable in einem zb if block definiere, ist sie in der selben methode ausserhalb des blockes nicht sichtbar...

also definierst du die variable einfach nicht in deinem switch block, sondern machst eine objektvarialbe....


```
package test;

import java.util.Scanner;

public class Test {
   Scanner s = new Scanner(System.in);
   
   String wert = "";
   
   public static void main(String[] args) {
       Test t = new Test();
       for(int i = 0; i <10; i++){
          t.eingabe();
          t.ausgabe();
       }
   }
   
   private void ausgabe() {
     System.out.println("wert ist: "+wert);
      
   }

   public void eingabe(){
      System.out.println("Zahl eingeben");
      int i = s.nextInt();
      switch (i) {
      case 1:
         wert = "eins";
         break;
      case 2:
         wert = "zwei";
         break;
      case 3:
         wert = "drei";
         break;
      case 4:
         wert = "vier";
         break;

      default:
         wert = "nix";
         break;
      }
   }

}
```


----------



## 0x7F800000 (4. Mrz 2009)

> geht das überhaupt?


selbstverständlich nicht, was soll das denn auch für einen sinn machen. swich ist doch ein langes entweder oder. Was du im ersten case initialisiert hast, wird im zweiten nie gebraucht, weil ja das erste case eingetreten ist...

Äääh, ARadauer, könntest du mal sagen was dieses komische beispiel da sollte?


----------



## Java-Problems (4. Mrz 2009)

ja danke, dass es so geht wusste ich auch.
ich dachte nur, dass es evtl. auch einen anderen Weg gibt in case 2 das in case 1 erstellte Objekt aufzurufen, da ich mir dadurch erheblich arbeit gespart hätte...


----------



## 0x7F800000 (4. Mrz 2009)

Java-Problems hat gesagt.:


> da ich mir dadurch erheblich arbeit gespart hätte...


voll der denkfehler... Was war denn das Ziel deiner Arbeit? "Unresolved Compilation Error" rauszubekommen?


----------



## ARadauer (4. Mrz 2009)

vielleicht hilft dir das...


```
public class Test {

   int z = 8;
   
   public static void main(String[] args) {
     Test t = new Test();
     t.doSomething();
   }
   
   private void doSomething() {
      int x = 5;
      System.out.println(z); //ist hier natürlich sichtbar
      if(true){
         int y = 6;     
         System.out.println(x); //klar ist x hier sichtbar
         
         System.out.println(z); //ist hier natürlich sichtbar
      }
     // System.out.println(y); // y kann hier nicht sichtbar sein.. fehler
      doSomethingOther();
   }
   
   private void doSomethingOther() {
     // System.out.println(x); // natürlich nicht sichtbar
      int x = 99; 
      System.out.println(x); //jetzt schon, das ist aber ein anderes x als das von doSomething
      
      System.out.println(z); //ist sichtbar
      int z = 33; //das ist jetzt eine lokale variable und hat nichts mehr mit dem des objekts zu tun
      printTheZ(); //das wird die 8 ausgeben
      System.out.println(z); //das die 33            
   }
   
   private void printTheZ() {
      System.out.println(z);
   }

}
```

bzw Kapitel 6 nochmal genau durchlesen
Galileo Computing :: Java ist auch eine Insel – 6 Eigene Klassen schreiben


----------



## ARadauer (4. Mrz 2009)

Andrey hat gesagt.:


> selbstverständlich nicht, was soll das denn auch für einen sinn machen. swich ist doch ein langes entweder oder. Was du im ersten case initialisiert hast, wird im zweiten nie gebraucht, weil ja das erste case eingetreten ist...
> 
> Äääh, ARadauer, könntest du mal sagen was dieses komische beispiel da sollte?



´hab mir gedacht, dass er sicher irgendwein auswahl menu mit switch case hat und jetzt zb in der zweiten auswahl das in der ersten erstellte objekt anzeigen möchte...


----------



## ARadauer (4. Mrz 2009)

ich bin mir auch sicher, dass das objekt irgendwas mit rezepten zu tun hat ;-)


----------



## 0x7F800000 (4. Mrz 2009)

swich case ist für jegliche erdenkliche menus schonmal unbrauchbar... Das verführt schnell zu hardgecodeten Optionen


----------



## maki (4. Mrz 2009)

Andrey hat gesagt.:


> swich case ist für jegliche erdenkliche menus schonmal unbrauchbar... Das verführt schnell zu hardgecodeten Optionen


Es gibt ja Leute die behaupten dass jedes switch-case durch Polymorphie ersetzt werden kann: The Clean Code Talks - Inheritance, Polymorphism and Testing


----------



## 0x7F800000 (4. Mrz 2009)

Von "jedem" swich-case habe ich nichts gesagt. Aber sowas wie:

```
swich(option){
  case 1:{
     //5 Zeilen
  }break;
  case 2:{
     //35 Zeilen
  }break;
  case 3:{
     //170 Zeilen
  }break;
  case 4:{
     //23 Zeilen
  }break;
  case 5:{
     //9 Zeilen
  }break;
  case 6:{
     //19 Zeilen
  }break;
```
kann in der anfangsphase schnell hingeschmiert werden, wenn man nicht dasselbe mit Interfaces erledigen will, und das resultiert dann im totalen chaos...

youtube will nicht?


----------



## Wildcard (5. Mrz 2009)

Andrey hat gesagt.:


> selbstverständlich nicht, was soll das denn auch für einen sinn machen. swich ist doch ein langes entweder oder. Was du im ersten case initialisiert hast, wird im zweiten nie gebraucht, weil ja das erste case eingetreten ist...


Kann man so aber nicht stehen lassen, da ein Switch fall-through ist.


----------



## 0x7F800000 (5. Mrz 2009)

Wildcard hat gesagt.:


> Kann man so aber nicht stehen lassen, da ein Switch fall-through ist.


Stimmt natürlich. Aber trotzdem macht das, was der OP vorhatte, immer noch keinen Sinn.

Also, gegen breaks hast du also was, bei diesem case-fall-through meinst du dennoch nicht, dass das ein kleines schmutziges Geheimnis wäre, das vergessen werden sollte? 
seltsam seltsam...


----------



## Noctarius (5. Mrz 2009)

Andrey hat gesagt.:


> Stimmt natürlich. Aber trotzdem macht das, was der OP vorhatte, immer noch keinen Sinn.
> 
> Also, gegen breaks hast du also was, bei diesem case-fall-through meinst du dennoch nicht, dass das ein kleines schmutziges Geheimnis wäre, das vergessen werden sollte?
> seltsam seltsam...



Jein, in "gewissen" Fällen kann das Sinnvoll sein!


```
Object foo = new ObjectInstance1();

switch (bar) {
    case 1:
        foo.methode1();
        break;

    case 2:
        foo.specialValueForMethode2(12345);

    case 3:
        foo.methode2();
        break;

    case 4:
    case 5:
    case 6:
        foo.methode3();
}
```

Nämlich wenn ich in einem GAAAAAANZ bestimmten Fall eine Vorinitialisierung vornehmen möchte aber den Code dahinter auch ausführen will oder ich auf mehrere Werte die selben Aktionen folgen lassen möchte.

Gerade im letzteren Fall finde ich die switch/case Lösung besser als folgender Code:

```
if (bar == 4 || bar == 5 || bar == 6) { ... }
```


----------



## ARadauer (5. Mrz 2009)

meine Meinung: Geschmacksache ;-)


----------



## 0x7F800000 (5. Mrz 2009)

Noctarius hat gesagt.:


> Nämlich wenn ich in einem GAAAAAANZ bestimmten Fall


Ich streite ja nicht ab, dass es in seltenen fällen sinnvoll sein könnte. Genau so wie labels^^


----------



## maki (5. Mrz 2009)

> Von "jedem" swich-case habe ich nichts gesagt.


Ich schon


----------



## Wildcard (5. Mrz 2009)

Andrey hat gesagt.:


> Also, gegen breaks hast du also was, bei diesem case-fall-through meinst du dennoch nicht, dass das ein kleines schmutziges Geheimnis wäre, das vergessen werden sollte?
> seltsam seltsam...


Seltsam ist eher diese Kuriosität:
Hier waren schon mindestens 2 C#ler unterwegs die versucht haben es mir als Vorteil von C# zu verkaufen das C# ein break im case erzwingt.

Damit das es kein fall through in C# gibt, könnte ich persönlich noch leben, aber keiner der beiden Kandidaten konnte einen validen Grund nennen warum man das break nicht einfach weglassen kann, wenn es sowieso implizit vorhanden ist.


----------



## hdi (5. Mrz 2009)

> Es gibt ja Leute die behaupten dass jedes switch-case durch Polymorphie ersetzt werden kann



Das stimmt auch, die Frage ist ob es immer Sinn macht.
Aber in 90%* der Fälle _macht_ es Sinn.
Gilt übrigens auch für die meisten if-else Statements, die keine primitiven Abfragen
machen -> equals auf irgendwelche Dinge

*Ich hab mir erlaubt nach der komplexen Rechnung von 89,950234 auf 90 aufzurunden.


----------



## Ebenius (6. Mrz 2009)

Wildcard hat gesagt.:


> aber keiner der beiden Kandidaten konnte einen validen Grund nennen warum man das break nicht einfach weglassen kann, wenn es sowieso implizit vorhanden ist.


Einen hab ich. Das '#'-Zeichen sind zwei sich überlappende, schräg versetzte '+'-Zeichen. In C++ braucht man das "break" auch. 

:!:

Ebenius


----------

