Best Practice Code refactern

lam_tr

Top Contributor
Hallo zusammen,

wie würdet ihr diesen Code schöner schreiben, oft komme ich zu so ein Pattern und weiß halt nicht wie es besser gehen kann. Dieser Code soll Tabellenspalten sortieren, jenachdem welche Spalte selektiert ist. Es geht mir nur rein ums schöner schreiben.

Code:
    private void initTableSort() {
        boolean isAsc = buttonASC.isSelected();
        if (radioId.isSelected()) {
            masterDataService.getBookings().sort((o1, o2) -> {
                if (isAsc) {
                    return o1.getId().compareTo(o2.getId());
                }
                return o2.getId().compareTo(o1.getId());
            });
        } else if (radioBetrag.isSelected()) {
            masterDataService.getBookings().sort((o1, o2) -> {
                if (isAsc) {
                    return Double.valueOf(o1.getAmount()).compareTo(Double.valueOf(o2.getAmount()));
                }
                return Double.valueOf(o2.getAmount()).compareTo(Double.valueOf(o1.getAmount()));
            });
        } else if (radioDatum.isSelected()) {
            masterDataService.getBookings().sort((o1, o2) -> {
                if (isAsc) {
                    return o1.getBookDate().compareTo(o2.getBookDate());
                }
                return o2.getBookDate().compareTo(o1.getBookDate());
            });
        } else if (radioKonto.isSelected()) {
            masterDataService.getBookings().sort((o1, o2) -> {
                if (isAsc) {
                    return o1.getAccount().getName().compareTo(o2.getAccount().getName());
                }
                return o2.getAccount().getName().compareTo(o1.getAccount().getName());
            });
        } else if (radioTyp.isSelected()) {
            masterDataService.getBookings().sort((o1, o2) -> {
                if (isAsc) {
                    return o1.getBookingType().compareTo(o2.getBookingType());
                }
                return o2.getBookingType().compareTo(o1.getBookingType());
            });
        } else if (radioVorgang.isSelected()) {
            masterDataService.getBookings().sort((o1, o2) -> {
                if (isAsc) {
                    return o1.getProcess().getName().compareTo(o2.getProcess().getName());
                }
                return o2.getProcess().getName().compareTo(o1.getProcess().getName());
            });
        }else if (radioTaxRate.isSelected()) {
            masterDataService.getBookings().sort((o1, o2) -> {
                if (isAsc) {
                    return (int) (o1.getTaxRate()-o2.getTaxRate());
                }
                return (int) (o2.getTaxRate()-o1.getTaxRate());
            });
        }

        filteredTableView.setInput(masterDataService.getBookings());
    }

Grüße
lam
 

LimDul

Top Contributor
Grundsätzlich gibt es bestimmt mehre Möglichkeiten. Das erste was mir ins Auge auffällt, ist der "lange" Lambda-Ausdruck. Ich versuche Ausdrücke der Form
Java:
(x) -> {
// Code
}
zu vermeiden, weil ich die schlecht lesbar halte und sie einfach enorm viel Platz aufnehmen.

Ich würde daher das erzeugen der Comparatoren und das sortieren trennen.

Erzeugen:
Code:
Comparator comparator = null;
if (radioId.isSelected()) {
comparator = Comparator.comparing(Booking:getId);
} else if (radioBetrag.isSelected()) {
comparator = Comparator.comparing(Booking:getAmount);
}
.// usw
if (!isAsc && comparator != null) {
comparator = comparator.reverse();
}
if (cmparator!=null) {
masterDataService.getBookings().sort(comparator);
}
Musst schauen, ob das erzeugen der Comparatoren grundsätzlich so geht (bei Amount bin ich mir nicht sicher, da das ggf. vorher noch in einen Double konvertiert werden muss)

Aber so finde ich das übersichtlicher.

Als weitere Ausbaustufe könnte man sich auch eine enum BookingSortKriterium überlegen und dann eine Methode getSortKriterium die je nach selektiertem RadioButton den entsprechenden Wert zurückliefert. Dann vereinfacht sich die if / else if Cascade in ein reines switch/case.

Als weiteren Schritt könnte man sich dann überlegen, das erzeugen der Comparatoren und das sortieren in eine eigene Klasse/Methode auszulagern, die als Eingabe bekommt:
* Die Liste
* Den Enum mit den Suchkriterium

Und die dann die Liste sortiert. Dann kann man die getrennt testen, die ist dann auch komplett unabhängig von der UI-Logik und im UI läge dann nur das Mapping radrioButtons => Enum und das auslesen/setzen der Liste.
 

lam_tr

Top Contributor
Grundsätzlich gibt es bestimmt mehre Möglichkeiten. Das erste was mir ins Auge auffällt, ist der "lange" Lambda-Ausdruck. Ich versuche Ausdrücke der Form
Java:
(x) -> {
// Code
}
zu vermeiden, weil ich die schlecht lesbar halte und sie einfach enorm viel Platz aufnehmen.

Ich würde daher das erzeugen der Comparatoren und das sortieren trennen.

Erzeugen:
Code:
Comparator comparator = null;
if (radioId.isSelected()) {
comparator = Comparator.comparing(Booking:getId);
} else if (radioBetrag.isSelected()) {
comparator = Comparator.comparing(Booking:getAmount);
}
.// usw
if (!isAsc && comparator != null) {
comparator = comparator.reverse();
}
if (cmparator!=null) {
masterDataService.getBookings().sort(comparator);
}
Musst schauen, ob das erzeugen der Comparatoren grundsätzlich so geht (bei Amount bin ich mir nicht sicher, da das ggf. vorher noch in einen Double konvertiert werden muss)

Aber so finde ich das übersichtlicher.

Als weitere Ausbaustufe könnte man sich auch eine enum BookingSortKriterium überlegen und dann eine Methode getSortKriterium die je nach selektiertem RadioButton den entsprechenden Wert zurückliefert. Dann vereinfacht sich die if / else if Cascade in ein reines switch/case.

Als weiteren Schritt könnte man sich dann überlegen, das erzeugen der Comparatoren und das sortieren in eine eigene Klasse/Methode auszulagern, die als Eingabe bekommt:
* Die Liste
* Den Enum mit den Suchkriterium

Und die dann die Liste sortiert. Dann kann man die getrennt testen, die ist dann auch komplett unabhängig von der UI-Logik und im UI läge dann nur das Mapping radrioButtons => Enum und das auslesen/setzen der Liste.
Super klasse, genau sowas habe ich gesucht. Das mit dem Account geht nicht, man muss es zuerst konvertieren, wie? Und der zweite Ansatz mit dem Einpacken der Sortierung in eine eigene Klasse ist auch cool.
 

lam_tr

Top Contributor
Ist das Konvertieren des Accounts hiermit gemeint

Code:
comparator = Comparator.comparing( t -> ((Booking)t).getAccount().getName());

Aber dann ist dieser Cast im Lamda nicht schön oder?
 

MoxxiManagarm

Top Contributor
Ich kann dem Ansatz von LimDul kaum etwas hinzufügen. Einzig und alleine würde ich die if-elses noch entfernen, zumindest an dieser Stelle. Du hast Radiobuttons, d.h. es gibt keinen Multiselect. Ich würde auf die Änderung reagieren und jedem Radio-Button einen Value zuordnen. Dieser Value nenne ich jetzt einfach mal "selectedComparator". Du speicherst also den Comparator beim Event Radio Button Selection Changed.

Dann ist der Code zum Sortieren relativ straight forward:
Java:
Comparator<Booking> selectedComparator; // wird durch die Auswahl eines RadioButtons verändert

if (!buttonASC.isSelected()) {
  selectedComparator = selectedComparator.reversed();
}
masterDataService.getBookings().sort(selectedComparator);
 

lam_tr

Top Contributor
Ich kann dem Ansatz von LimDul kaum etwas hinzufügen. Einzig und alleine würde ich die if-elses noch entfernen, zumindest an dieser Stelle. Du hast Radiobuttons, d.h. es gibt keinen Multiselect. Ich würde auf die Änderung reagieren und jedem Radio-Button einen Value zuordnen. Dieser Value nenne ich jetzt einfach mal "selectedComparator". Du speicherst also den Comparator beim Event Radio Button Selection Changed.

Dann ist der Code zum Sortieren relativ straight forward:
Java:
Comparator<Booking> selectedComparator; // wird durch die Auswahl eines RadioButtons verändert

if (!buttonASC.isSelected()) {
  selectedComparator = selectedComparator.reversed();
}
masterDataService.getBookings().sort(selectedComparator);

Sorry habe das noch nicht ganz verstanden wie du das mit Comparator in RadioButton verpacken meinst. Aber dein Ansatz wäre das entfernen der If/else oder?
 

MoxxiManagarm

Top Contributor
Ja. Du könntest jedem RadioButton einen ActionListener ergänzen.
Also z.B.
Java:
radioId.addActionListener((ActionEvent e) -> selectedComparator = Comparator.comparingInt(Booking::getId));

Dann hast du an keiner Stelle ein riesiges if-else Konstrukt.
Die Sortierfunktion musst du dann nie wieder anfassen, wenn ein Feld hinzukommt. Wenn ein Feld hinzzukommt, welches du für de Sortierung anbietest, dann ergänzt du einfach wieder einen RadioButton der den entsprechenden Comparator als selected setzt.

Also das ActionEvent ist ein Beispiel für Swing. Du verwendest SWT? Da sieht es möglicher Weise etwas anders aus, aber ich denke das Prinzip ist klar.
 
Zuletzt bearbeitet:

lam_tr

Top Contributor
Ja. Du könntest jedem RadioButton einen ActionListener ergänzen.
Also z.B.
Java:
radioId.addActionListener((ActionEvent e) -> selectedComparator = Booking::getId);

Dann hast du an keiner Stelle ein riesiges if-else Konstrukt.
Die Sortierfunktion musst du dann nie wieder anfassen, wenn ein Feld hinzukommt. Wenn ein Feld hinzzukommt, welches du für de Sortierung anbietest, dann ergänzt du einfach wieder einen RadioButton der den entsprechenden Comparator als selected setzt.
Interesssant, und wo trigger ich die Sortierung? Meine RadioButtons rufen ohnehin schon die #initTableSort() Methode auf
 

MoxxiManagarm

Top Contributor
Dann könntest du selectedComparator nicht speichern und ihn stattdessen der initTableSort Methode als Parameter übergeben.

Also sinngemäß
Java:
radioId.addActionListener((Actionevent e) -> initTableSort(Comparator.comparingInt(Booking::getId)));

private void initTableSort(Comparator<Booking> comparator) {
 

lam_tr

Top Contributor
Dann könntest du selectedComparator nicht speichern und ihn stattdessen der initTableSort Methode als Parameter übergeben.

Also sinngemäß
Java:
radioId.addActionListener((Actionevent e) -> initTableSort(Comparator.comparingInt(Booking::getId)));

private void initTableSort(Comparator<Booking> comparator) {
So geht das bei mir leider nicht. Ich habe es so implementiert

Code:
    public void onButtonAction(ActionEvent event) {
        Object source = event.getSource();
        if (source == buttonEinnahmenErstellen) {
           dispatchOnEinnahmeErstellen();
        }  else if (source == buttonNextDay) {
           ....
        } else if (source == buttonPreviousDay) {
           ....
        } else if (source == radioBetrag || source == radioDatum || source == radioId || source == radioKonto
                || source == radioTyp || source == radioVorgang || source == buttonASC) {
            initTableSort();
        }
    }

Ich weiß nicht ob das ein guter Ansatz ist, aber zumindest ist das eine zentrale Stelle für mich wenn ich nach Listener schauen will. Es wurde dann gehen wenn ich es ausplitte , dann wäre die if /else zweige hier anstatt in der initTableSort() Methode.
 

LimDul

Top Contributor
Ich würde lieber jedem Button einen eigenen Listener spendieren (Das ist Java FX, oder? Da bin ich nicht so firm drin).

Grundsätzlich gilt: Keine Scheu vor mehr Klassen. Lieber aus einer langen Methode mehrere kleinere machen und dann aus einer Klasse mit vielen Methoden mehrere Klassen machen.

Bei dem Code oben würde eine statische Codeanalyse wie CheckStyle oder SpotBugs dir auf die Finger klopfen, weil die If-Bedingung viel zu viele Bedingungen hat.

Edit, Nachtrag:
Hier ist die Checkstyle Regel: https://checkstyle.sourceforge.io/a...metrics/BooleanExpressionComplexityCheck.html
Property max - Specify the maximum number of boolean operations allowed in one expression. Default value is 3.
 

MoxxiManagarm

Top Contributor
Ich weiß nicht ob das ein guter Ansatz ist
Aus meiner Sicht nicht. Ich kann diesen Ansatz nicht leiden :D Das wird schnell unübersichtlich und fehleranfällig. Aber vor allem unflexibel, wie du nun siehst. Ich mag selbst halt auch keine großen if-else Konstrukte. Ich kann für fast alle if-else Konstrukte andere Varianten finden. Du hast hier halt auch ein solch riesiges Konstrukt.

Außerdem geben if-else einer Methode Komplexität, welche durch Code-Check-Programme durchaus auch angemeckert werden kann. Das wird dann im beruflichen Umfeld relevant.
 

lam_tr

Top Contributor
Ich würde lieber jedem Button einen eigenen Listener spendieren (Das ist Java FX, oder? Da bin ich nicht so firm drin).

Grundsätzlich gilt: Keine Scheu vor mehr Klassen. Lieber aus einer langen Methode mehrere kleinere machen und dann aus einer Klasse mit vielen Methoden mehrere Klassen machen.

Bei dem Code oben würde eine statische Codeanalyse wie CheckStyle oder SpotBugs dir auf die Finger klopfen, weil die If-Bedingung viel zu viele Bedingungen hat.
Ja genau, ist JavaFX. Schlussendlich mache ich für jeden Control schon eine Methode. die onButtonAction Methode dispatch an der Stelle die controls zu den Listenern, ist das in dem Fall wirklich nicht Sinnvoll (wahrscheinlich wegen de 20 If/else Zweige wa?).
 

MoxxiManagarm

Top Contributor
Ein Alternativ-Vorschlag hätte ich noch, wie du bei deinem ActionListener bleiben kannst. Dann müsstest du eine SubKlasse von deinem RadioButton erstellen, also Sinngemäß

Java:
class SortingRadioButton extends RadioButton {
  private Comparator<Booking> comparator;

  public SortingRadioButton(Comparator<Booking> comparator) {
    super();
    this.comparator = comparator;
  }
}


... 
else if (source == radioBetrag || source == radioDatum || source == radioId || source == radioKonto
                || source == radioTyp || source == radioVorgang || source == buttonASC) {
            initTableSort(initTableSort(((SortingRadioButton)source).getComparator()));
        }
 

LimDul

Top Contributor
Was wäre das? Ich habe auch schon oft gelesen dass man sparsam damit umgehen soll if / else, aber wie geht man sonst anders vor. Wäre ein Switch Case mit Enum wie @LimDul oben erwähnt schon sinnvoller oder?
Das ist eine Möglichkeit.

Oft ist aber sinnvoller "weiter oben" (was immer das konkret heißt) schon zu verzweigen. Beispiel mit der onAction Methode:

n Elemente gehen auf eine onAction Methode, die wiederum an m andere Methoden delegiert. Elemeniere den Zwischenschritt das an eine Stelle zu verdichten und verpasse jedem Element eine eigene onAction Methode - da kann man mit Sicherheit auch viel mit Lambda Ausdrücken arbeiten um direkt an die Methoden zu delegieren.
 

LimDul

Top Contributor
Ein Alternativ-Vorschlag hätte ich noch, wie du bei deinem ActionListener bleiben kannst. Dann müsstest du eine SubKlasse von deinem RadioButton erstellen, also Sinngemäß

Java:
class SortingRadioButton extends RadioButton {
  private Comparator<Booking> comparator;

  public SortingRadioButton(Comparator<Booking> comparator) {
    super();
    this.comparator = comparator;
  }
}


...
else if (source == radioBetrag || source == radioDatum || source == radioId || source == radioKonto
                || source == radioTyp || source == radioVorgang || source == buttonASC) {
            initTableSort(initTableSort(((SortingRadioButton)source).getComparator()));
        }
Dann könnte man eigentlich da schreiben
Java:
else if (source instanceof SortingRadioButton) { // usw.
 

lam_tr

Top Contributor
Ein Alternativ-Vorschlag hätte ich noch, wie du bei deinem ActionListener bleiben kannst. Dann müsstest du eine SubKlasse von deinem RadioButton erstellen, also Sinngemäß

Java:
class SortingRadioButton extends RadioButton {
  private Comparator<Booking> comparator;

  public SortingRadioButton(Comparator<Booking> comparator) {
    super();
    this.comparator = comparator;
  }
}


...
else if (source == radioBetrag || source == radioDatum || source == radioId || source == radioKonto
                || source == radioTyp || source == radioVorgang || source == buttonASC) {
            initTableSort(initTableSort(((SortingRadioButton)source).getComparator()));
        }
Das würde eventuell gehen wen die Klasse in mein FXML lade. Aber ich glaube ich mache für jeden Control einen eigenen Listener und gebe dort die Sortierung mit, wie du weiter oben schon erwähnt hast.
 

tommysenf

Top Contributor
Java:
private void initTableSort() {
        boolean isAsc = buttonASC.isSelected();
        
        masterDataService.getBookings().sort((o1, o2) -> {
                 int comparism = 0;
                 if (radioId.isSelected()) {
                        comparism = o1.getId().compareTo(o2.getId());
                 } else if(radioBetrag.isSelected) {
                       comparism = Double.valueOf(o1.getAmount()).compareTo(Double.valueOf(o2.getAmount()));
                } ....
                return isAsc ? comparism : comparism *= -1
            });
        filteredTableView.setInput(masterDataService.getBookings());
    }
 

mrBrown

Super-Moderator
Mitarbeiter
Du könntest die RadioButtons in einer ToggleGroup wrappen und den Comparator den RadioButtons jeweils als UserData mitgeben.

Dann bräuchte es nur einen Listener an der ToogleGroup, und den aktuellen Comparator bekämest du über ToogleGroup#getToogle#getUserData.
 

LimDul

Top Contributor
Vielleicht noch mal eine etwas allgemeinere Anmerkung zu Refaktoring Vorgehen. Was meines Erachtens an der Stelle viel hilft sind Unit-Tests (bis hin zu Testdriven Development). Denn wenn man anfängt Unit-Tests zu schreiben, stellt man schnell fest:

* Ich komme an den Teil schlecht ran, den ich testen will
* Ich brauche riesig Setup-Aufwand um die Konstellation aufzubauen

Dann zerhackt man den Code in kleinere Einheiten (=mehr Methoden/mehr Klassen).

Beispiel auf deinen konkreten Code bezogen, was will man testen?

* Wenn ich Betrag aufsteigend sortieren will, wird korrekt sortiert. Was brauche ich da bei deinem Ursprungscode?
** Ich muss alle Radiobuttons erzeugen
** Ich muss den korrekten Radiobutton auf selected setzen
** Ich brauche einen masterDataService
** Ich brauche eine TableView

So, das ist extrem viel Aufwand - nur um zu testen, ob die Sortierung klappt.

Zerhackt man das in mehrere Teilprobleme:

* Ich ermittle aus den Radio-Buttons den Comparator (kann ich separat testen)
* Ich kann die Comparatoren separat testen
* Ich kann dann testen, ob die Übertragung aus dem masterService in die Sortiermethode klappt
* Ich kann dann testen, dass die Rückgabe aus der Sortiermethode in die TableView klappt

Insgesamt habe ich da über alle Tests sogar weniger Setup-Aufwand als bei dem Test deiner Methode.

Man kommt bei dem Vorgehen oft zu Stellen, wo man - nur um einen Aspekt separat zu testen - entscheidet Teile in eigene Methoden auszulagern.
 

lam_tr

Top Contributor
Vielleicht noch mal eine etwas allgemeinere Anmerkung zu Refaktoring Vorgehen. Was meines Erachtens an der Stelle viel hilft sind Unit-Tests (bis hin zu Testdriven Development). Denn wenn man anfängt Unit-Tests zu schreiben, stellt man schnell fest:

* Ich komme an den Teil schlecht ran, den ich testen will
* Ich brauche riesig Setup-Aufwand um die Konstellation aufzubauen

Dann zerhackt man den Code in kleinere Einheiten (=mehr Methoden/mehr Klassen).

Beispiel auf deinen konkreten Code bezogen, was will man testen?

* Wenn ich Betrag aufsteigend sortieren will, wird korrekt sortiert. Was brauche ich da bei deinem Ursprungscode?
** Ich muss alle Radiobuttons erzeugen
** Ich muss den korrekten Radiobutton auf selected setzen
** Ich brauche einen masterDataService
** Ich brauche eine TableView

So, das ist extrem viel Aufwand - nur um zu testen, ob die Sortierung klappt.

Zerhackt man das in mehrere Teilprobleme:

* Ich ermittle aus den Radio-Buttons den Comparator (kann ich separat testen)
* Ich kann die Comparatoren separat testen
* Ich kann dann testen, ob die Übertragung aus dem masterService in die Sortiermethode klappt
* Ich kann dann testen, dass die Rückgabe aus der Sortiermethode in die TableView klappt

Insgesamt habe ich da über alle Tests sogar weniger Setup-Aufwand als bei dem Test deiner Methode.

Man kommt bei dem Vorgehen oft zu Stellen, wo man - nur um einen Aspekt separat zu testen - entscheidet Teile in eigene Methoden auszulagern.
Ja ich weiß was du meinst, ich versuch mal so langsam vor zu gehen, danke!
 

MoxxiManagarm

Top Contributor
Aber ich glaube ich mache für jeden Control einen eigenen Listener und gebe dort die Sortierung mit, wie du weiter oben schon erwähnt hast.
Wie auch immer du dich letztlich entscheidest, der Grundgedanke läuft in jedem Ansatz darauf hinaus deiner initTableSort Methode mit Hilfe eines Comparators nur noch zu sagen was sie sortieren soll. Du definierst hier immer nur den Ascending Comparator, welcher durch comparator.reversed() bei Bedarf (Descending) umgedreht werden kann. Dadurch nimmt die Komplexität an der Stelle deutlich ab.
 

LimDul

Top Contributor
Ja ich weiß was du meinst, ich versuch mal so langsam vor zu gehen, danke!
Das ist auch ein Lernprozess, der nie aufhört. Ich hab mittlerweile auch über 10 Jahre Berufserfahrung auf dem Buckel - und just diese Woche eine Review Anmerkung von einem Kollegen bekommen. Da ging es um einen Dialog, wo ich nur einen Test für den "Cancel" Button hatte. Da kam die Anmerkung "Da fehlt ein Test für den OK-Button". Ja, den hatte ich versucht zu schreiben, aber ging halt nicht. Aber dann halt noch mal rangesetzt und aus der Methode, die den Dialog baut zwei gemacht - eine public, eine protected und die Protected so geschnitten von den Parametern, dass ich die Konstellation sinnvoll testen konnte.
 

lam_tr

Top Contributor
Das ist auch ein Lernprozess, der nie aufhört. Ich hab mittlerweile auch über 10 Jahre Berufserfahrung auf dem Buckel - und just diese Woche eine Review Anmerkung von einem Kollegen bekommen. Da ging es um einen Dialog, wo ich nur einen Test für den "Cancel" Button hatte. Da kam die Anmerkung "Da fehlt ein Test für den OK-Button". Ja, den hatte ich versucht zu schreiben, aber ging halt nicht. Aber dann halt noch mal rangesetzt und aus der Methode, die den Dialog baut zwei gemacht - eine public, eine protected und die Protected so geschnitten von den Parametern, dass ich die Konstellation sinnvoll testen konnte.
Ja das sind die Erfahrungen die man mit sich nimmt. Es ist echt wertvoll wenn man hier auf dem guten Wege geleitet wird, solche Dinge kann man nur gut verstehen wenn man das veranschaulicht bekommt.
 

lam_tr

Top Contributor
Du könntest die RadioButtons in einer ToggleGroup wrappen und den Comparator den RadioButtons jeweils als UserData mitgeben.

Dann bräuchte es nur einen Listener an der ToogleGroup, und den aktuellen Comparator bekämest du über ToogleGroup#getToogle#getUserData.

Das gefällt mir sehr.

Code:
ToggleGroup tg = new ToggleGroup();
        tg.selectedToggleProperty().addListener(new ChangeListener<Toggle>() {
            @Override
            public void changed(ObservableValue<? extends Toggle> observable, Toggle oldValue, Toggle newValue) {
                if (newValue!=null) {
                    Object userData = newValue.getUserData();
                    System.out.println(userData);
                }
            }
        });
        
        radioId.setToggleGroup(tg);
        radioId.setUserData("ID");
        radioKonto.setToggleGroup(tg);
        radioKonto.setUserData("Konto");
        radioBetrag.setToggleGroup(tg);
        radioBetrag.setUserData("Betrag");
        radioDatum.setToggleGroup(tg);
        radioDatum.setUserData("Datum");

Ich habe nur auf die Schnelle getestet, da sollen die Comparatoren rein :)

@MoxxiManagarm
Jetzt ist es mir wesentlich klarer, danke dir auch.
 

MoxxiManagarm

Top Contributor
Ich habe als Neuling übrigens auch meistens globale Listener verwendet, allerdings waren das auch alles mini-Projekte ohne Komplexität und noch vor Java 8 Lambdas. Besonders die Lambdas haben viel vereinfacht an der Stelle. Mit steigender Erfahrung weiß man bestimmte Dinge halt zu schätzen und würde es nie wieder anders machen wollen. Natürlich muss man diesen Dingen erstmal begegnen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Kann mir jemand wörtlich erklären, was in dem Code genau passiert? Java Basics - Anfänger-Themen 1
Ü Dead Code im Programm? Java Basics - Anfänger-Themen 13
I QR code in Java selber generieren Java Basics - Anfänger-Themen 5
terashy VS Code Project run error Java Basics - Anfänger-Themen 10
JaZuDemNo Code Erklärung Java Basics - Anfänger-Themen 3
M Connect-4-Code analysieren Java Basics - Anfänger-Themen 2
N BMI Rechner Was haltet ihr von dem Code habt ihr Verbesserungsvorschläge weil design teschnisch ist das nicht das geilste würde das gerne überarbeiten Java Basics - Anfänger-Themen 12
W In alten Code zurück- und dort wieder zurechtfinden? Java Basics - Anfänger-Themen 17
T code so schreiben das er von sich selber anpasst (code soll die anzahl aller bustaben bestimmen) Java Basics - Anfänger-Themen 16
J Frage zu einem "Taschenrechner" code Java Basics - Anfänger-Themen 9
T Fehlercode bei code der das Alter ausrechnet Java Basics - Anfänger-Themen 2
T Text einlesen code was kommt dahin? Java Basics - Anfänger-Themen 1
jhfjeh Strukturgramm in code Java Basics - Anfänger-Themen 11
D Tipps zum Code Java Basics - Anfänger-Themen 24
W Java-Code mit Array Java Basics - Anfänger-Themen 14
W Java-Code Java Basics - Anfänger-Themen 2
W Java code- TicTac toe Java Basics - Anfänger-Themen 51
W Java-code Java Basics - Anfänger-Themen 8
W Java-code Java Basics - Anfänger-Themen 9
W Java-Code erklären Java Basics - Anfänger-Themen 6
ohneInformatik; For Schleife. Was macht dieser Code?? Java Basics - Anfänger-Themen 5
Say Fehlenden Code finden in einer while-Schleife? Java Basics - Anfänger-Themen 11
Say 2-DIM Array Code lesen und verstehen Java Basics - Anfänger-Themen 5
Say Stelle in Code herausfinden, wie geht man vor? Java Basics - Anfänger-Themen 12
Say do-While Code Ausführung Java Basics - Anfänger-Themen 3
W Rückfrage zur Programmgestaltung (clean code) Java Basics - Anfänger-Themen 12
M intelliJ auf neuem PC, plötzlich kein Code Java Basics - Anfänger-Themen 3
Pinhg Sound in Greenfoot Code einbinden Java Basics - Anfänger-Themen 2
C Java boolean Code läuft nicht Java Basics - Anfänger-Themen 5
I Code für Bezahlsystem (auch bei Offline Aktivität) Java Basics - Anfänger-Themen 7
J Größter gemeinsamer Teiler: mein Code Java Basics - Anfänger-Themen 6
B Den Dateipfad einer Java Datei durch Code in Selbiger finden? Java Basics - Anfänger-Themen 10
A Wie könnte man diesen Code kürzer machen ? Java Basics - Anfänger-Themen 7
J Frage zu meinem Code (OOP) Java Basics - Anfänger-Themen 4
Alen123 Warum funktioniert mein Code nicht? Java Basics - Anfänger-Themen 64
Max246Sch Frage zu Währungsrechner Code Java Basics - Anfänger-Themen 2
S Hilfe bei Umänderung von Java Code Java Basics - Anfänger-Themen 16
I Code wird nicht ausgeführt Java Basics - Anfänger-Themen 2
K Wie kann man diesen Code schnell und effizient interpretieren (Man hat nur 4 Minuten) Java Basics - Anfänger-Themen 3
R ISBN-10-Code überprüfen Java Basics - Anfänger-Themen 7
I Bitte um Hilfe zu unterstehenden Code Java Basics - Anfänger-Themen 6
I Interface von einer EJB Klasse, um Code zu reduzieren Java Basics - Anfänger-Themen 1
I HTML Code säubern Java Basics - Anfänger-Themen 4
B Brauche Hilfe zu einem Code Java Basics - Anfänger-Themen 5
Temsky34 Problem mit dem Code Java Basics - Anfänger-Themen 17
N Fehler im Code (Aufgabe für Anfänger) Java Basics - Anfänger-Themen 11
N Java-Code abwärtskompatibel machen Java Basics - Anfänger-Themen 4
J Erste Schritte Was mache ich in meinem Code falsch. Java Basics - Anfänger-Themen 3
Ameise04 Variablen Inhalt einer Variable im Code verwenden? Java Basics - Anfänger-Themen 9
S Compiler-Fehler Nicht adressierbarer Code ( Non-addressable code ) Java Basics - Anfänger-Themen 5
Aemulit Java Schaltjahr berechnen Code Java Basics - Anfänger-Themen 7
A Code Problem Java Basics - Anfänger-Themen 6
C Fehler im Code Java Basics - Anfänger-Themen 10
A Zu einem bestimmten Ort im Code springen Java Basics - Anfänger-Themen 11
L Ist der Code richtig Java Basics - Anfänger-Themen 3
josfe1234 code vereinfachen Java Basics - Anfänger-Themen 15
nonickatall Ausführbarkeit von Code testen bzw. Remote Debugging Java Basics - Anfänger-Themen 4
F Frage betreff Programm mit dem man C++-Code in JAVA-Code übersetzen lassen kann Java Basics - Anfänger-Themen 2
S Fehler bei Code mit SubStrings für mich nicht auffindbar. Java Basics - Anfänger-Themen 4
G Programm Code Java Basics - Anfänger-Themen 5
C Code zusammenfassen Java Basics - Anfänger-Themen 5
I Erklärung zum Java Code Java Basics - Anfänger-Themen 2
T Programmablaufsplaninterpretation in Code umformen Java Basics - Anfänger-Themen 1
dieter000 Kurze Frage kann mir ejmand kurz diesen Code erklären, bzw wie man die zeilen erklärt und so Java Basics - Anfänger-Themen 1
AlexVo String zu Java Anweisung getString("*** java code ***") Java Basics - Anfänger-Themen 19
M ISBN-Code Java Basics - Anfänger-Themen 26
B Zeitgleiches Arbeiten am Code mit mehreren Personen? Java Basics - Anfänger-Themen 7
S Wie kann ich bei diesem Code erreichen, das als Ergebnis hier 15 herauskommt? Java Basics - Anfänger-Themen 23
N Kann man den Code vereinfachen? Java Basics - Anfänger-Themen 25
marcooooo Code erklären Java Basics - Anfänger-Themen 28
marcooooo Code erklären Java Basics - Anfänger-Themen 4
S Advent of Code Day4 Java Basics - Anfänger-Themen 4
B Nach eingefügtem Code erkennt Compiler keine Instanzvar und meldet SyntaxError Java Basics - Anfänger-Themen 2
Gaudimagspam Caesars Code entziffern in Java Java Basics - Anfänger-Themen 8
Lukasbsc Wie kann ich meinen Code optimieren? Java Basics - Anfänger-Themen 4
NeoLexx equals()-Methode Verständnis Frage anhand Code Beispiel Java Basics - Anfänger-Themen 22
I Input/Output Code wird doppelt ausgeführt Java Basics - Anfänger-Themen 3
T Main startet nicht bei vorgegebenen Code Java Basics - Anfänger-Themen 41
B Frage zum Code verständnis im Resultat Java Basics - Anfänger-Themen 10
J Fehler im Code, aber ich weiß nicht wieso! Java Basics - Anfänger-Themen 6
S Mehrere Probleme im Code Java Basics - Anfänger-Themen 7
M Code nur für Cracks? Crack the Passwort Übung Java Basics - Anfänger-Themen 7
parrot Code entferneJedeZweiteZiffer Java Basics - Anfänger-Themen 6
G Code kürzen Java Basics - Anfänger-Themen 5
Bluedaishi Source Code Signieren Java Basics - Anfänger-Themen 22
L Best Practice Code Refactoring für Methoden mit fast gleicher Aufbau Java Basics - Anfänger-Themen 6
G code kürzen Java Basics - Anfänger-Themen 16
A Code umschreiben Java Basics - Anfänger-Themen 6
Torsten.E JavaFX mit Visual Studio Code verwenden Java Basics - Anfänger-Themen 1
C Beispiel-Code mit Pair wird nicht compiliert. Java Basics - Anfänger-Themen 8
X Reverse algorithm engineering (Java code) Java Basics - Anfänger-Themen 6
T Bufferedwriter code Nullpointerexception Java Basics - Anfänger-Themen 4
V Switch Methode macht Code kaputt Java Basics - Anfänger-Themen 18
R Was muss ich an meinem Code ändern? Java Basics - Anfänger-Themen 2
S Bewertet meinen Code - Part 1 Java Basics - Anfänger-Themen 8
M Java Code Verständnis Java Basics - Anfänger-Themen 4
M Java Code Verständnis Java Basics - Anfänger-Themen 2
J Ich brauche Hilfe bei einem Code (Variablen speichern) Java Basics - Anfänger-Themen 29
F Hierarchi im code darstellen Java Basics - Anfänger-Themen 11
S Struktogramm zu Code Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben