Wie kann ich eine Funktion schreiben, die nur in bestimmten Fällen einen Wert zurückgibt?

ffff

Neues Mitglied
Hi,
ich versuche eine Funktion zu schreiben, welche die Schnittpunkte zweier Kreise berechnet. Mit JavaScript ist mir dies auch gelungen. Ich brauche diese Funktion aber nun in Java, womit ich kaum Erfahrung habe. Wenn ich eine neue Funktion erstelle muss ja die Art des Rückgabewertes angegeben werden z.B. float oder wenn es keinen Rückgabwert geben soll void. Nun soll meine Funktion aber nur dann auch einen Wert zurückgeben, wenn sich die zwei Kreise auch wirklich schneiden und ansonsten nichts. Wie kann ich das umsetzen?
 
Da ist die Frage, was genau deine Funktion zurückgibt.

Wenn es ein primitiver Typ ist (also z.B. float), dann hast du keine andere Wahl, als auch eine float zurückzugeben, oder einen Fehler zu schmeißen.

Wenn es ein Objekt ist (also z.B. Float), dann hast du immer auch die Möglichkeit, einfach "null" als Antwort zurück zu geben. Da muss man dann aber dort, wo man die Funktion benutzt, aufpassen, dass mit NULL richtig umgegangen wird.

Bei deinem Anwendungsfall kann die Ausgabe ja eigentlich gar kein Primitive sein, weil ein Schnittpunkt ja üblicherweise aus zwei Zahlen besteht. Außerdem kann es auch mehr als einen Schnittpunkt geben. Wie genau sieht denn deine Funktion bis jetzt aus?
 
Grundsätzlich gibt es da mehrere Möglichkeiten

Variante 1:
Code:
public Punkt berechneSchnittpunkt(Circle c1, Circle c2) {
  if (noSchnittpunkt) {
    return null;
  }
  // ...
  return schnittpunkt;
}
Sprich, einfach null zurückgeben, wenn kein Schnittpunkt existiert.

null hat allerdings ein paar Nachteile - wenn jemand versucht, auf der Rückgabe etwas aufzurufen, dann fliegt eine NullPointerException. Sprich, der Aufrufer muss wissen, dass er die Rückgabe auf != null prüfen muss, bevor er was damit macht.

Variante 2:
Code:
public Optional<Punkt> berechneSchnittpunkt(Circle c1, Circle c2) {
  if (noSchnittpunkt) {
    return Optional.empty();
  }
  // ...
  return Optional.of(schnittpunkt);
}

Optional ist ein Objekt was sagt, es kann was drin, muss aber nicht. Hat auch seine Vor- und Nachteile. Es zwingt den Aufrufer sich Gedanken zu machen, ob er wirklich ein Objekt bekommen hatten. Ist dafür aber etwas unhandlicher im Handling.
 
Grundsätzlich gibt es da mehrere Möglichkeiten

Variante 1:
Code:
public Punkt berechneSchnittpunkt(Circle c1, Circle c2) {
  if (noSchnittpunkt) {
    return null;
  }
  // ...
  return schnittpunkt;
}
Sprich, einfach null zurückgeben, wenn kein Schnittpunkt existiert.

null hat allerdings ein paar Nachteile - wenn jemand versucht, auf der Rückgabe etwas aufzurufen, dann fliegt eine NullPointerException. Sprich, der Aufrufer muss wissen, dass er die Rückgabe auf != null prüfen muss, bevor er was damit macht.

Variante 2:
Code:
public Optional<Punkt> berechneSchnittpunkt(Circle c1, Circle c2) {
  if (noSchnittpunkt) {
    return Optional.empty();
  }
  // ...
  return Optional.of(schnittpunkt);
}

Optional ist ein Objekt was sagt, es kann was drin, muss aber nicht. Hat auch seine Vor- und Nachteile. Es zwingt den Aufrufer sich Gedanken zu machen, ob er wirklich ein Objekt bekommen hatten. Ist dafür aber etwas unhandlicher im Handling.
Danke für deine Antwort.
Ich denk ich werde das dann wie die Variante 1 umsetzen und dann halt zuerst immer gucken, ob die Funktion wirklich einen Schnittpunkt oder null zurückgibt. Ich hatte gehofft, dass man wir bei JavaSccript einfach einen leeren Array oder so zurückgeben kann.
 
Java ist ein streng typisierte Sprache. Das heißt, wenn du ein Array zurückgeben willst, dann darf deine Methode nur Arrays zurückgeben und nicht mal dies und mal das.

Was z.B. auch geht, wenn einen Listentyp zurückgibst, eine Leere Liste zurückgeben. Das kann bei Schnittpunkten (wo es 0, 1, 2 geben kann) auch interessant sein.

Java:
public List<Punkt> berechneSchnittpunkt(Circle c1, Circle c2) {
  if (noSchnittpunkt) {
    return new ArrayList();;
  }
  // ...
  return listeMitSchnittpunkten;
}
 
Die Liste ist in diesem Fall (2 Kreise) die zu bevorzugende Methode, es gibt nämlich entweder keinen Schnittpunkt, einen tangentialen Berührungspunkt oder zwei Schnittpunkte.

Würdest du 2 Linien verschneiden, dann wäre null oder Optional die richtige Wahl, wobei ich Optional den Vorrang geben würde, das ist die modernere Art es zu machen, die Prüfungen finden über Methoden des Rückgabewerts statt anstatt über Vergleichsoperatoren.

Java:
var point = ...;
if (point != null) {
    doSomethingWith(point);
} else {
    ...
}

//vs
var optionalPoint = ...;
if (optionalPoint.isPresent()) {
    doSomethingWith(optionalPoint.get())
} else {
    ...
}
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben