Java Problem mit switch

Sneazel

Lt. Commander
🎅Rätsel-Elite ’24
Registriert
Aug. 2011
Beiträge
1.154
Hey,

ich vergleiche 2 ints mit einander
dabei gibt es drei Fälle
a < b , a=b, a > b

wie macht man das in einer Switch bedingung?

switch ( a < b ) betrachtet nur a < b oder a >= b

da dachte ich mir zieh ich die voneinander ab

switch(a-b)
nur krieg ich jetzt den case nicht hin
case 0: ... geht
case <0 geht wiederum nicht genauso wenig wie case >0

in ruby gibt es afaik <=> Operator damit wäre es einfach... aber sowas finde ich unter Java nicht.

ich weiß, dass das Problem eig. banal rüber kommt, aber ich finde keine Lösung.
 
Wieso willst du für so eine simple Abfrage switch-case benutzen?
Aber wenns unbedingt sein muss, machs doch wie folgt:
Code:
switch(Math.signum(a-b)) {
 case -1: "a < b";
 case 0: "a == b";
 case 1: "a > b";
}
 
was spricht dagegen?
drei Ifs sind nicht gerade schön
aber danke für den Tipp!
 
yoT!mO schrieb:
Wieso willst du für so eine simple Abfrage switch-case benutzen?
Aber wenns unbedingt sein muss, machs doch wie folgt:
Code:
switch(Math.signum(a-b)) {
 case -1: "a < b";
 case 0: "a == b";
 case 1: "a > b";
}

Hab schon länger kein Java gecodet, sondern nur C++, aber gehört hier nicht auch nach jede case-Zeile ein break?
 
Ja tut es, es war nur beispielhaft
 
Jain. Sollte man machen, muss man aber nicht zwangsläufig. Das break sorgt nur dafür, dass die restlichen cases nicht auch noch abgefragt werden, wenn schon einer zutrifft.

Gruß Timo
 
Zudem sei gesagt: Jede switch Anweisung sollte immer einen default Block enthalten.
 
Also wenn man den ganzen nötigen "Overhead" des switch-Statements sieht, merkt man, dass es in diesem Kontext eigentlich nicht wirklich eleganter ist als

Code:
if (a < b) {
  ...
}
else if (a > b) {
  ...
}
else {
  ...
}
 
Paxi schrieb:
Zudem sei gesagt: Jede switch Anweisung sollte immer einen default Block enthalten.
Wenn da noch etwas anderes herauskommen kann, als die 3 Möglichkeiten, die abgefragt werden, ist das ein Bug in Java und darum sollte sich der Programmierer nicht kümmern, sondern die Entwickler von Java.
 
asdfman schrieb:
Wenn da noch etwas anderes herauskommen kann, als die 3 Möglichkeiten, die abgefragt werden, ist das ein Bug in Java und darum sollte sich der Programmierer nicht kümmern, sondern die Entwickler von Java.

Ist in diesem Trivialfall richtig, dennoch gilt es als best practice immer einen default-fall anzugeben, da es bei komplexeren switch statements nicht so leicht zu überschauen ist.
 
Ich sehe es als best practice, sein Hirn einzuschalten und nicht stumpf sinnfreien Code zu schreiben, nur weil es einer im CDB-Forum behauptet hat.
 
@asdfman:
An eine Best Practice muss man sich nicht halten, wenn einem klar ist, warum man sie nicht anwendet. Es sind ja auch keine Regeln. Mir fallen keine Situationen ein, sein Hirn bewusst nicht zu verwenden, insofern sehe ich "Hirn einschalten" nicht als Best Practice an sondern als Voraussetzung.

Und wenn ich ein enum habe, mit 3 Möglichkeiten, dann ist es doch auch sinnfrei, einen default-Fall zu haben, wenn ich im Switch doch alle 3 Fälle behandle... oder etwa nicht?



Und im Übrigen: Man hätte im hiesigen Beispiel auch den Fall "case 1" als defaul nehmen können...
 
Zuletzt bearbeitet:
Ich finde switch hier nicht nur wenig elegant sondern völlig deplatziert. Die von 1668mib vorgeschlagene if-Verzweigung würden andere Programmierer auf Anhieb verstehen, diese switch hingegen ist unnötig kryptisch. Dazu kommt, dass man auf floats nicht switchen kann (signum liefert float) und selbst wenn man casted, müssen da breaks hinter die cases, sonst hast du einen fall-through und alles wird ausgegeben, auch wenn nur der erste Fall eintritt.
Es ist sicher sinnvoll nach eleganten Lösungen zu suchen, aber einfach "anders" bzw. einfach kryptischer ist nicht unbedingt der Königsweg.
 
Paxi schrieb:
Zudem sei gesagt: Jede switch Anweisung sollte immer einen default Block enthalten.

Sehe ich anders.

Wenn kein Case zutrifft wird eben der nächste Code ausgeführt. also der Code unterhalb switch ff.

Bei einer if-Abfrage ohne else passiert auch nix wenn die Bedingung nicht zutrifft.
 
Zurück
Oben