Wann Rückgabewerte 0, 1, -1?

Wuast

Bekanntes Mitglied
Hallo Leute,
nach einiger Zeit mal wieder eine Frage... vermutlich total blöde aber mein Gehirn verknotet sich und ich stehe auf dem Schlauch.

Wann und warum haben Methoden Rückgabewerte wie 0 oder 1, wenn ich diese integer gar nicht weiter benötige? Platzhalter? Oder haben sie das gar nicht und ich habe etwas falsch verstanden? Insbesondere der RÜckgabewert 0 verwirrt mich da.

Ich kenne es bisher so, dass ich einen integer Rückgabewert dann verwende, bspw. in einem switch-case oder so, um je nach Rückgabewert eine andere Methode aufzurufen oder ähnliches.

Hoffe das war verständlich :D
Danke und schonmal liebe Grüße
 

Staarfightaar

Bekanntes Mitglied
es kommt immer auf den kontext an

als beispiel
bei comapre to ist es "festgelegt" wie man mit den werten hantieren soll
Compares this object with the specified object for order. Returns a negative integer, zero, or a positive integer as this object is less than, equal to, or greater than the specified object.
-1 = weniger
0 = gleich
1 = größer

kannst du ein konkretes beispiel nennen wo du es verwirrend findest?
 

Staarfightaar

Bekanntes Mitglied
kann vllt auch sein dass daran die enums schuld haben ( maybe ? )

du hast ja auch in swing noch komponenten wo du werte mit "konstanten" setzt hinter denen stecken aber eig integer
man könnte diese heutzutage wahrscheinlich besser mit enums umsetzen aber warum sollte man alles umwuchten..

für compare to hätte man ja auch
Java:
enum Val{
    GREATER,EQUALS,LESS;
}
benutzen können .. hinter enums stehen ja auch zahlen, i c++ und c# kann man enum werte in int casten und funktioniert weis auch nicht warum man das wie wann wo gemacht hat

wird sich schon irgendjemand was dabei gedacht haben .. aber das nur als fun nebenbei
 

mihe7

Top Contributor
Wann und warum haben Methoden Rückgabewerte wie 0 oder 1, wenn ich diese integer gar nicht weiter benötige?
Wann? Wenn der Entwickler der Methode sich dafür entschieden hat.
Warum? Weil der Entwickler irgendeinen Grund für seine Entscheidung sieht.
Ob Du den Rückgabewert benötigst bzw. verwendest, weiß der Entwickler nicht.

Das hört sich etwas dämlich an, ist aber tatsächlich so. Es ist reine Definitionssache.

Wenn der Entwickler keinen äußeren Zwängen unterliegt, kann er sich frei entscheiden, was er tut. Wenn ich will, nehme ich statt void als Rückgabetyp int und gebe immer 0 zurück. Ob das sinnvoll ist, steht auf einem anderen Blatt und darauf wirst Du hinaus wollen.

Nehmen wir mal ein Beispiel: die lastIndexOf-Methode von java.lang.String. Die liefert den Index des letzten Vorkommens eines gegebenen Zeichens im String, -1, wenn das Zeichen nicht im String enthalten ist.

Ist -1 sinnvoll? Eine negative Zahl ist in jedem Fall sinnvoll, weil ein Index nicht negativ sein kann. Hätte man auch -2 nehmen können? Sicher, nur für irgendwas muss man sich entscheiden und mit der -1 lässt sich z. B. einfach schreiben:
Java:
int ix = str.length() - 1;
while (ix >= 0 && str.chatAt(ix) != ch) {
    ix--;
}
return ix;
Wenn das gesuchte Zeichen ch nicht im String str enthalten ist, dann läuft die Schleife so lange, bis ix >= 0 gerade nicht mehr gilt und das ist der Fall, wenn ix == -1 gilt.

Anderes Beispiel: wenn Du aus einem InputStream liest, liefert die read()-Methode -1, wenn keine weiteren Zeichen vorhanden sind. Ist das sinnvoll? Sicher, denn ein Byte bewegt sich nur im Bereich zwischen 0 und 255. Hätte man dann nicht auch 256 verwenden können? Klar, aber das wäre ungünstig, denn vielleicht will man ja ein Zeichen lesen (Reader) und dort bewegt man sich schon im Wertebereich zwischen 0 und 65535. Also ist eine negative Zahl auch hier nicht die schlechteste Wahl und -1 ist halt schöner als -321.

Math.signum() liefert (allerdings als double) das "Vorzeichen": -1 falls eine Zahl negativ ist, 0, falls die Zahl 0 ist und 1, falls die Zahl positiv ist (und NaN, falls es keine Zahl (NaN) ist). Hier sind die Konstanten wichtig, ansonsten könnte man ja gleich die Zahl direkt verwenden. Damit lassen sich Rechnungen vereinfachen.

In dem Zusammenhang:
für compare to hätte man ja auch
Java:
enum Val{
GREATER,EQUALS,LESS;
}
benutzen können .
Nein, denn compare liefert gerade keine Konstanten sondern nur negative oder positive Zahlen bzw. die 0. Das hat den Vorteil, dass man zwei ganze Zahlen einfach durch Subtraktion miteinander vergleichen kann.
 

Neumi5694

Top Contributor
Bei Indexoperationen ist das Ganze sinnvoll, wurde schon beschrieben.

Für einen Komparator braucht man nur -1, 0, 1. Hier wäre ein Enum-Wert in der Tat sinnvoller/lesbarer (dazu noch mit boolean Auswertung z.B. .isLesser(), das würde den Code sehr viel leichter lesbar machen).
Allerdings gab's die Java-Enums in dieser Form noch gar nicht, als die Comparator-Klasse definiert wurde, Enums wurden erst in Java 5 eingeführt. Ist halt noch Oldstyle-Programmierung.

Einige Komparatoren auch so umgesetzt, dass sie einen anderen Wert als -1 oder 1 liefern können. Für einen Komparator ist das zwar Overkill, für andere Operationen kann es aber schon mal sinnvoll sein. Da man sich aber nie darauf verlassen kann, was jetzt eigentlich geliefert wird und was die Werte bedeuten, kann man nur sehr spezialisiert was damit anfangen die mehr aussagen als größer oder kleiner.
 

mihe7

Top Contributor
Hier wäre ein Enum-Wert in der Tat sinnvoller/lesbarer (dazu noch mit boolean Auswertung z.B. .isLesser(), das würde den Code sehr viel leichter lesbar machen).
Der Comparator müsste dann z. B. so aussehen:
Java:
public Result compare(int a, int b) {
    if (a < b) {
        return Result.LESS
    }  else if (a > b) {
        return Result.GREATER;
    }
    return Result.EQUAL;
}
statt
Java:
public Result compare(int a, int b) {
    return a - b;
}

und bei der Verwendung:
Java:
if (compare(a,b).lessThanOrEqualTo()) { 
...
statt
Java:
if (compare(a,b) <= 0) { 
...

Ob da wirklich so viel gewonnen wäre...
 

httpdigest

Top Contributor
Das hat den Vorteil, dass man zwei ganze Zahlen einfach durch Subtraktion miteinander vergleichen kann.
Das ist leider so nicht _ganz_ korrekt. Ein Integer.compare(x, y) kann _nicht_ durch x - y implementiert werden, aufgrund von Überlauf. Ein Integer.MIN_VALUE wäre somit nicht kleiner als 1.
Aus dem Grund ist Integer.compare(x, y) auch relativ kompliziert als return (x < y) ? -1 : ((x == y) ? 0 : 1); implementiert
 

Neumi5694

Top Contributor
Der Comparator müsste dann z. B. so aussehen:
Java:
public Result compare(int a, int b) {
    if (a < b) {
        return Result.LESS
    }  else if (a > b) {
        return Result.GREATER;
    }
    return Result.EQUAL;
}
statt
Java:
public Result compare(int a, int b) {
    return a - b;
}

und bei der Verwendung:
Java:
if (compare(a,b).lessThanOrEqualTo()) {
...
statt
Java:
if (compare(a,b) <= 0) {
...

Ob da wirklich so viel gewonnen wäre...
Aktuell machst du eine Subtraktion, vergleichst danach, ob das Ergebnis < 0 ist.
(compareresult < 0)
(compareresult > 0)
(compareresult == 0)

Die tatsächliche Implentierung wurde oben eh schon genannt.


Würden enums verwendet, würde der Vergleich im Komparator stattfinden (anstatt der Subtraktion), extern wäre es dann so.
compareResult.wasLesser()
compareResult.wasGreater())
compareResult.wasEqual()

Ich finde das angenehmer zu lesen und zu warten, ist natürlich Geschmackssache

Und für alles andere außer Zahlen wäre es sowieso angenehmer. Lesser/Greater/Equal sind aber ziemlich mathematisch ausgedrückt. Nachdem's uns bei Komparatoren normalerweise um Sortierungen geht, wäre wohl eine andere Terminologie besser.
 
Zuletzt bearbeitet:

Staarfightaar

Bekanntes Mitglied
Nein, denn compare liefert gerade keine Konstanten sondern nur negative oder positive Zahlen bzw. die 0. Das hat den Vorteil, dass man zwei ganze Zahlen einfach durch Subtraktion miteinander vergleichen kann.
deswegen hab ich ja auch geschrieben man "hätte können" ...

das mit den konstanten war auf swing bezogen wo man für die modi "konstanten" aus der klasse übergibt aber da eig ein int dahinter steht
 

Wuast

Bekanntes Mitglied
es kommt immer auf den kontext an

als beispiel
bei comapre to ist es "festgelegt" wie man mit den werten hantieren soll

-1 = weniger
0 = gleich
1 = größer

kannst du ein konkretes beispiel nennen wo du es verwirrend findest?
tatsächlich kam die Frage an dieser Stelle und bei der Verwendug von Rekursiven Methoden auf.
Da ist mir aber bewusst geworden, dass ich häufiger mal irgendwas habe, wo auch abgesehen davon ein return 0; auftauchte. Z.B. als letzter command in einer Methode ala
Java:
int methode () {
    
    if (blabla){
        return 200;
    }
    else if (blubb){
        return 300;
    }
    
    // und jetzt was mich verwirrte:
    
    return 0;
            
}

Aber ich denke, das hat Mihe ganz gut erörtert :D Ich sollte aufhören, unnötig kompliziert zu denken und mir das Leben schwer zu machen. Ich lass mich da auch schnell verunsichern wenn ich den Code von jemande lese und dann feststelle, dass ich das ganz grundsätzlich anders angegangen wäre oder vllt. auch einfach nicht direkt alles verstehe.

Danke für die zahlreichen Rückmeldungen.
 

mihe7

Top Contributor
Ich lass mich da auch schnell verunsichern wenn ich den Code von jemande lese und dann feststelle, dass ich das ganz grundsätzlich anders angegangen wäre oder vllt. auch einfach nicht direkt alles verstehe.
Wenn Du fremden Code bekommst, ist es relativ normal, dass Du Dich erst einmal einlesen musst. Jeder hat seinen eigenen Stil, ggf. muss man sich auch erst in den Problembereich etwas einarbeiten.

Um Dein Beispiel aufzugreifen, dort sehe ich: ok, wenn blabla, dann 200, wenn blubb, dann 300 ansonsten 0. Ich weiß zwar (noch) nicht, was das soll, aber was in welchem Fall zurückgegeben wird, steht fest. Und dann muss ggf. nachgeforscht werden, um sich den Sinn von methode() zusammenreimen zu können.

Wenn dort etwas wie
Java:
int methode () {
    
    if (blabla){
        return NO_PERMISSION;
    }
    else if (blubb){
        return NOT_AUTHENTICATED;
    }
    
    return OK;
            
}
gestanden hätte, hättest Du Dir nichts weiter dabei gedacht und schon eine Vorstellung davon gehabt, worum es in der Methode geht. Darum vermeidet man magic numbers (https://de.wikipedia.org/wiki/Magische_Zahl_(Informatik)). Statt der Konstanten wäre ein enum-Typ hier natürlich noch schöner.
 

Wuast

Bekanntes Mitglied
Ich weiß zwar (noch) nicht, was das soll, aber was in welchem Fall zurückgegeben wird, steht fest. Und dann muss ggf. nachgeforscht werden, um sich den Sinn von methode() zusammenreimen zu können.

Wenn dort etwas wie
Java:
int methode () {
   
    if (blabla){
        return NO_PERMISSION;
    }
    else if (blubb){
        return NOT_AUTHENTICATED;
    }
   
    return OK;
           
}
Das soll garnix, einfach ein Freestyle-Bsp. für diese Rückgabewerte, die mir Funktionslos schienen und mich verwirrten. ^^
Aber du hast nat. Recht, bei deinem Bsp wär es direkt klar.
 

Neumi5694

Top Contributor
Ich denke, er meint so was wie (15 - Integer.MIN_VALUE);
Das ist mehr als Integer.MAX_VALUE, würde also negativ sein, obwohl 15 eindeutig größer ist als Integer.MIN_VALUE.
Mit einem Zusatzbit könnte man das Problem für einen Komparator umgehen, allerdings würde das auch nicht dazu führen, dass bei der Subtraktion der korrekte Wert ausgegeben wird. Einfach einen Vergleich verwenden und gut is. Damit spart man sich den Ärger.
 
Zuletzt bearbeitet:

mihe7

Top Contributor
@Staarfightaar, es geht um die Posts #8 und #9. Es ist richtig, dass für einen allgemeinen Integer-Vergleich die dargestellte Lösung in #8 nicht taugt. Tatsächlich vergleicht man oft aber keine beliebigen Integer-Werte, vielmehr ist der Wertebereich durch die Domäne eingeschränkt. Beispielsweise ist ein char ein vorzeichenloser 16 Bit-Wert, das Alter einer Person liegt kaum über 150 und wird selten negativ usw.
 

Staarfightaar

Bekanntes Mitglied
so wie ich die grundfrage verstanden habe ging es um vor "definierte methoden ergebnisse" wie compare to wo man immer ein -1 0 1 bekommt oä methoden die schon implementiert sind .. also um den grundsinn wann man sowas auspackt
 

mihe7

Top Contributor
so wie ich die grundfrage verstanden habe ging es um vor "definierte methoden ergebnisse" wie compare to wo man immer ein -1 0 1 bekommt oä methoden die schon implementiert sind .. also um den grundsinn wann man sowas auspackt
Bei compare bekommt man ja gerade kein -1, 0 oder 1 sondern das Ergebnis ist kleiner 0, gleich 0 oder größer 0.
 

Neumi5694

Top Contributor
wenn ich nur auf diese 3 eigenschaften prüf ist es doch egal ob ich 1 3 oder 200000 zurück gebe da sowieso nur result > 0 geprüft wird
Genau darum ging's. Normalerweise werden Komparatoren für Sortierungen verwendet, wo es komplett wurscht ist, wie hoch der Wert ist. Deshalb kam die Idee mit der Subtraktion auf (wobei ich aber nicht glaube, dass größer/kleiner schneller oder langsamer ist als eine Subtraktion), die sich aber als fehleranfällig erweisen würde, wenn der gesamte Integer-Bereich genutzt würde.

Es gibt einzelne Komparatoren, deren Rückgabewert mehr beinhaltet als nur größer und kleiner (wenn ich mich nicht irre, gehören die compare Methoden von Strings dazu), aber die sind selten und sehr spezialisiert.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
KogoroMori21 Wann ist der richtige Zeitpunkt, um sich Hilfe zu suchen? (Bin Informatik-Student) Java Basics - Anfänger-Themen 10
I Logik Zahlungsprozess - Wann Bestellobjekt anlegen? Java Basics - Anfänger-Themen 2
C Java Array Struktur, welche ist wann besser? Java Basics - Anfänger-Themen 12
berserkerdq2 Java streams, wann nutze ich ::, also 2x Doppelpuntk bei Streams? Java Basics - Anfänger-Themen 5
W Wann und warum hashcode und equals? Java Basics - Anfänger-Themen 14
berserkerdq2 Wann soll ich den Stream schließen, wenn ich das in einer Methode habe? Java Basics - Anfänger-Themen 8
K In andere Zahlensysteme umwandeln, wann klappt immer der Trick mit log? Java Basics - Anfänger-Themen 6
W Zur Vererbung: Wann und wie? Java Basics - Anfänger-Themen 35
F Wann ist es eine Instanz und wann nicht? Java Basics - Anfänger-Themen 1
C Instanzen, wann muss ich Instanzen erzeugen & wo?) Java Basics - Anfänger-Themen 23
S Wann Methode abstract? Java Basics - Anfänger-Themen 10
S Wann buffer löschen? Java Basics - Anfänger-Themen 5
R Wie überprüfen wann der User online oder offline ist? Java Basics - Anfänger-Themen 5
C Polymorphie Was genau ist Polymorphie und wann genau sollte man es verwenden? Java Basics - Anfänger-Themen 9
I Wann ist Client plattformunabhängig? Java Basics - Anfänger-Themen 22
M Best Practice Wann eine Methode schreiben ? Java Basics - Anfänger-Themen 14
K Warum funktioniert das und wann erden die Objektmethoden nun ausgeführt? Java Basics - Anfänger-Themen 7
IngoF Welches Event kommt wann? Java Basics - Anfänger-Themen 8
M Wann eigene implementierte HashCode Methode zwingend erforderlich? Java Basics - Anfänger-Themen 1
X Wann schreibt man diese Syntax zeichen { } Java Basics - Anfänger-Themen 8
O Wann nutzt man static? Java Basics - Anfänger-Themen 19
C Klassendesign / Wann Interface implementieren und wann Klassen vererben? Java Basics - Anfänger-Themen 3
S Wann existiert eine Instanz (eigene Klasse) Java Basics - Anfänger-Themen 8
M Wann PATH und wann JAVA_HOME in Windows System 7 setzen? Java Basics - Anfänger-Themen 2
M Wann final verwenden? Java Basics - Anfänger-Themen 5
M Wann eine Wrapper Klasse verwenden und wann einen primitiven Datentypen? Java Basics - Anfänger-Themen 8
D Ab wann getter und setter Java Basics - Anfänger-Themen 2
B Erkennen, wann static oder nicht? Java Basics - Anfänger-Themen 7
E wann welche Konstanten verwenden? Java Basics - Anfänger-Themen 7
P Wann Byte-Stream und wann Character-Stream? Java Basics - Anfänger-Themen 11
T Vererbung Wann wird die Methode paint aufgerufen? Java Basics - Anfänger-Themen 4
M Wann statische Methoden/Attribute? Java Basics - Anfänger-Themen 2
vandread Java Wildcards - Wann super wann extends? Java Basics - Anfänger-Themen 2
K Wann Vererbung und wann Interface verwenden? Java Basics - Anfänger-Themen 12
D Wann genau nutze ich ein solches Interface? Java Basics - Anfänger-Themen 3
K Wann genau brauche ich die Anweisung gleich null? Java Basics - Anfänger-Themen 10
B Wann toString() überschreiben? Java Basics - Anfänger-Themen 21
S OOP Wann Proxies und Interfaces? Java Basics - Anfänger-Themen 3
P Threads Wann läuft es parallel ab ? Java Basics - Anfänger-Themen 4
C Variablen Wann werden Instanzvariablen initalisiert? Java Basics - Anfänger-Themen 10
P Java Stream, wann welche Stream verwenden? Java Basics - Anfänger-Themen 3
T Ab wann ist es ein großes Projekt? Java Basics - Anfänger-Themen 35
N Bessere Performance durch final: wann denn überhaupt? Java Basics - Anfänger-Themen 28
D Wann genau abstrakte Klasse und wann ein Interface verwenden? Java Basics - Anfänger-Themen 4
W Wann nutze ich "import"? Java Basics - Anfänger-Themen 12
A junit test wann verwendet man "was"? Java Basics - Anfänger-Themen 4
H Wann ein Objekt der Programmklasse in main anlegen Java Basics - Anfänger-Themen 2
G Wann ist ein == Vergleich bei Gleitkommazahlen fahrlässig? Java Basics - Anfänger-Themen 8
T Wann for und wann while?? Java Basics - Anfänger-Themen 35
-horn- Wann wird alles NaN erzeugt? Java Basics - Anfänger-Themen 22
S Wann wird eine Klasse geladen? Java Basics - Anfänger-Themen 17
C this - wann verwende ich das? Java Basics - Anfänger-Themen 10
T Threads - Ab wann wirds Kritisch?! Java Basics - Anfänger-Themen 7
M Wann muss man eine Variable mit set-/get-Methoden in eine Bean schreiben? Java Basics - Anfänger-Themen 19
G field public/private wann Java Basics - Anfänger-Themen 11
GambaJo Ab wann neue Klasse erzeugen? Java Basics - Anfänger-Themen 2
G Wann Arrays, wann Collections? Java Basics - Anfänger-Themen 36
GambaJo Wann try.catch nutzen? Java Basics - Anfänger-Themen 11
B objekt wann als final deklarieren? Java Basics - Anfänger-Themen 2
N Wann muss eine Methode - protected sein wann public wann. Java Basics - Anfänger-Themen 5
Y Wann / Wozu inner class Java Basics - Anfänger-Themen 3
K StringBuilder notwendig ab wann? Java Basics - Anfänger-Themen 42
S wann static Funktionen wann nicht Java Basics - Anfänger-Themen 6
N Wann und wie oft finalize Methode verwenden( überschreiben ) Java Basics - Anfänger-Themen 6
Bernasconi Programmierstil / Wann eine neue Datei? Java Basics - Anfänger-Themen 5
M wann, welche schleife Java Basics - Anfänger-Themen 3
M Ab wann ist die Datei sichtbar? Java Basics - Anfänger-Themen 3
G Herausfinden, wann mehrere Threads abgeschlossen sind Java Basics - Anfänger-Themen 3
G Überprüfen wann ein Dokument abläuft? Java Basics - Anfänger-Themen 3
N SAX, StAX, JDOM oder DOM , ab wann welches für XML Java Basics - Anfänger-Themen 14
M Wann ist ein Programm beendet? Java Basics - Anfänger-Themen 6
G Wann am besten getSize() aufrufen? Java Basics - Anfänger-Themen 6
I Festellen wann Methode in anderer Klasse fertig ist Java Basics - Anfänger-Themen 5
M wann statische klassen? Java Basics - Anfänger-Themen 14
M Wann ist initialisieren sinnvoll? Java Basics - Anfänger-Themen 4
B Wann Comparator und wann Comparable Java Basics - Anfänger-Themen 6
R Wann benutzt man << oder >> ? Java Basics - Anfänger-Themen 2
G Klassen: Wann initialisiere ich wo meine Variabeln Java Basics - Anfänger-Themen 6
C Interface Parameter und Rückgabewerte in Lambda Ausdrücken verwenden Java Basics - Anfänger-Themen 16
D Methoden abstrakte Methoden und Rückgabewerte Java Basics - Anfänger-Themen 2
S Datentypen Funktion: 2 mögl. Rückgabewerte Java Basics - Anfänger-Themen 4
S javac - Rückgabewerte an die Shell Java Basics - Anfänger-Themen 10
G Instanz-Rückgabewerte abspeichern Java Basics - Anfänger-Themen 2
J Mehrere Rückgabewerte? Java Basics - Anfänger-Themen 8
G 2 Rückgabewerte? Java Basics - Anfänger-Themen 17
G 2 rückgabewerte Java Basics - Anfänger-Themen 9
S Mehrere Rückgabewerte möglich? Java Basics - Anfänger-Themen 7
G Rekursion Rückgabewerte in Array speichern Java Basics - Anfänger-Themen 12
K Simple Frage zu Methoden und Rückgabewerte Java Basics - Anfänger-Themen 3
T Rückgabewerte verschiedener Typen Java Basics - Anfänger-Themen 3
T Threat und Rückgabewerte Java Basics - Anfänger-Themen 7
H Mehrere Rückgabewerte Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben