Java: Boolean ausgeben ohne true/false statement?

3 Antworten

Dein Problem liegt hier:

System.out.println(jahreszahl[i] + " " + schaltJahr(jahreszahl[i]));

Du konkatenierst das Ergebnis von schaltJahr mit in einen String hinein, der schließlich ausgegeben wird. Du würdest das Problem folgendermaßen lösen:

System.out.print(jahreszahl[i] + " ");
schaltJahr(jahreszahl[i]);

Die Ausgaben in der Methode sollten dann via println getätigt werden, sodass Jahreszahl und Ergebnis immer in einer Zeile stehen. Außerdem sollten die Ausgaben in schaltJahr sicherlich mit einem Punkt enden, statt einem Doppelpunkt. Oder du drehst die Ausgabe um (und belässt es in der Methode bei print):

schaltJahr(jahreszahl[i]);
System.out.println(jahreszahl[i]);

Bezüglich Verbesserungen:

Eine Funktion sollte eigentlich immer nur einem bestimmten Zweck dienen. Wenn du bspw. die Fahrfähigkeit eines Autos programmierst, hast du eine Einteilung in bremsen, steuern, Gas geben, usw.. Möglicherweise sind diese Funktionen nochmal weiter unterteilt, führen intern noch andere Funktionen aus. Doch sie sind nur auf ihre Aufgabe fokussiert. Eine Funktion bremsen wird nicht nebenbei die Klimaanlage aufdrehen oder die Scheibenwischer betätigen.

Bezogen auf deinen Fall führt deine Funktion schaltJahr zwei Funktionen aus: Sie prüft, ob die Eingabe ein Schaltjahr ist und sie gibt eine Meldung an das UI aus (println). Das sollte nicht sein, es ist unflexibel. Angenommen, die Methode sollte nun in einem anderen Kontext ausgeführt werden - z.B. im Zusammenspiel mit einer grafischen Oberfläche. Sie würde immer noch Ausgaben auf der Konsole produzieren, obwohl die längst nicht mehr benötigt werden.

Das Ziel wäre es also, dass sich die Funktion auf ihren eigentlichen Zweck beschränkt:

public static boolean istSchaltjahr(int jahr) {
  if ((jahr % 4 == 0) && (jahr % 100 != 0) || (jahr % 400 == 0)) {
    return true;
  }
  else {
    return false;
  }
}

Dies ließe sich nun sogar noch weiter verkürzen:

public static boolean istSchaltjahr(int jahr) {
  return (jahr % 4 == 0) && (jahr % 100 != 0) || (jahr % 400 == 0);
}

Der Aufrufer kann letztendlich entscheiden, wie er mit dem Ergebnis umgeht. Ob daraufhin Konsolenausgaben erzeugt werden oder irgendetwas anderes gemacht wird.

if (istSchaltjahr(irgendeinJahr)) {
  System.out.println("Ist ein Schaltjahr.");
}
else {
  System.out.println("Ist kein Schaltjahr.");
}

Du wirst vermutlich an meinen Beispielen auch bemerkt haben, dass ich den Funktionsnamen geändert habe. Das hat folgenden Grund: Funktionen sollten mit Verben / Tätigkeiten bezeichnet werden, damit man sie besser erkennt. Ein Programmcode lässt sich so flüssiger lesen. Substantive sind eher Klassen und Objekten vorbehalten.

Zudem noch ein weiterer Tipp (es sei denn, es lag am GF-Editor): Setze mehr Leerzeichen. Diese Zeile:

if((jahr%4==0)&&(jahr%100!=0)||(jahr%400==0)){

wirkt gedrungen und gestaucht. Beim Lesen muss sich das Auge mehr anstrengen, den Operator von den konkreten Literalen und Bezeichnern zu trennen. Das produziert somit auch potenzielle Fehlerquellen.

So:

if ((jahr % 4 == 0) && (jahr % 100 != 0) || (jahr % 400 == 0)) {

ist es besser.

Das Leerzeichen nach dem if setze ich zudem nur, um deutlich zu machen, dass es sich hier gerade um eine Kontrollstruktur und keinen Funktionsaufruf handelt.

Beispiel:

for (int i = 0; i < 5; ++i) {
  if (checkSomething()) {
  }
}

doSomething(1, 2, 3);

schaltJahr(int jahr) gibt nunmal ein boolean zurück und das wird dann auch ausgegeben. Also entweder du packst die Ausgabe stattdessen in die main Methode:

public static void main(String args[]) {
   int[]jahreszahl = {1600, 1800, 1900, 2000, 2012, 2019};
   for(int i = 0; i<jahreszahl.length; i++){
        System.out.println((schaltJahr(jahreszahl[i]) ? "Ist ein Schaltjahr: " : "Ist kein Schaltjahr: ") + jahreszahl[i]);
    }
}

oder z.B. du änderst den Rückgabewert auf String

public class MyClass {
    //1.1
    public static String schaltJahr(int jahr){
        if((jahr%4==0)&&(jahr%100!=0)||(jahr%400==0)){
            return "Ist ein Schaltjahr: " + jahr;
        } else {
            return "Ist kein Schaltjahr: " + jahr;
        }
    }
    //1.2
    public static void main(String args[]) {
        int[]jahreszahl = {1600, 1800, 1900, 2000, 2012, 2019};
        for(int i = 0; i<jahreszahl.length; i++){
            System.out.println(schaltJahr(jahreszahl[i]));
        }
    }
}

Ich würde dir dazu eigene Discords / Foren empfehlen, da in der Gutefrage Community oft unerfahrene Developer ihre nicht vorhandene Erfahrung abgeben ;)

Woher ich das weiß:eigene Erfahrung

regex9  14.12.2019, 14:39

Interessant. Nach 4 Jahren GF-Mitgliedschaft ist das, wenn ich jetzt richtig geschaut habe, dein allererster Beitrag zu einer Frage des Themas Programmierung. Ich hätte ja bei so einer Kritik erwartet, dass du dich dann hier reger daran beteiligen würdest, die von dir bemängelte Qualität zu verbessern. Oder dass du diese Frage hier gleich löst, sie lässt sich doch eher in den Bereich Grundlagen einordnen.

0
MuffingamerHD1  18.12.2019, 06:48
@regex9

Habe ich gesagt das ich es selber gut kann? Nein. Deshalb gebe ich auch keine unnötigen falsch Aussagen ab.

0
regex9  18.12.2019, 11:11
@MuffingamerHD1

Deine Falschaussage besteht darin, der Plattform die Kompetenz in diesem Thema absprechen zu wollen, obwohl du, wie du ja zugibst, nicht genügend Grundlage für so etwas hast. Ein Großteil der Antworten hier kommt von Berufsentwicklern und Studenten. Schlechte Antworten werden meist korrigiert. Solltest du auf einen Negativfall stoßen, steht es dir frei, via Kommentar zu korrigieren.

0
MuffingamerHD1  22.12.2019, 13:10
@regex9

Ich konnte hier nur von meiner Erfahrung sprechen. Ich hatte nie behauptet es selber zu wissen. Ich wollte ihn eben nur von dem, was ich mitbekommen habe helfen.

0