Folgende Abfrage dynamisch programmieren?

B

beta20

Top Contributor
Hallo zusammen,

ich habe folgenden Code. Dieser Code prüft das Feld von einem RuleConditionComponent-Objekt ab (ConditionState).
1) Heißt ruleConditionComponent.getFieldName() dem Feldname (in diesem Fall "NAME")
2) Danach welchen (ConditionState) das Feld hat.

Derzeit habe ich von einer Klasse diese Abfrage zig Mal (für jedes Feld), also statt "NAME", dann "EMAIL" usw.
Die Frage ist nun, kann man diesen Code irgendwie dynamisch programmieren?
Also:
a) eine Schleife über alle Felder einer Klasse
b) Prüfen, ob das Feld so heißt, wie ruleConditionComponent.getFieldName()
c) ruleConditionComponent.getState().equals(RuleConditionComponent.ConditionState.EQUAL.toString() -> Dieser Code bleibt dann eben bestehen für jeden Zustand...
c) Wenn b) richtig ist, dann von diesem Feld den Wert nehmen und mit dem Wert von ruleConditionComponent.getValue() vergleichen

-> Also was ich bräuchte:
a) Von newObjectForCheck.getRequest().getName() -> Den getName dynamisch halten und bei Schleifendurchlauf die nächste Property der Klasse nehmen...
b) Request.EntityField.NAME.getFieldName() -> Hier habe ich für jede Propertie einen String angelegt bisher, der den Namen der Property in einen String schreibt. Dies müsste ebenfalls irgendwie automatisch gehalten werden. Gibt es hier nicht Annotationen über der Property selbst? (sowas habe ich schon Mal gesehn)


Java:
    ///////////////////
        // NAME
        ///////////////////
        if (ruleConditionComponent.getFieldName()
                .equals(Request.ENTITY_NAME_SPACE + Request.EntityField.NAME.getFieldName())) {

            if (newObjectForCheck.getRequest().getName() == null)
                return false;

            if (ruleConditionComponent.getState().equals(RuleConditionComponent.ConditionState.EQUAL.toString())) {
                if (newObjectForCheck.getRequest().getName().equalsIgnoreCase(ruleConditionComponent.getValue())) {
                    return true;
                }
            }

            if (ruleConditionComponent.getState().equals(RuleConditionComponent.ConditionState.NOT_EQUAL.toString())) {
                if (!newObjectForCheck.getRequest().getName().equalsIgnoreCase(ruleConditionComponent.getValue())) {
                    return true;
                }
            }

            if (ruleConditionComponent.getState().equals(RuleConditionComponent.ConditionState.CONTAINS.toString())) {
                if (newObjectForCheck.getRequest().getName().toLowerCase()
                        .contains(ruleConditionComponent.getValue().toLowerCase())) {
                    return true;
                }
            }

            if (ruleConditionComponent.getState()
                    .equals(RuleConditionComponent.ConditionState.NOT_CONTAINS.toString())) {
                if (!newObjectForCheck.getRequest().getName().toLowerCase()
                        .contains(ruleConditionComponent.getValue().toLowerCase())) {
                    return true;
                }
            }
        }

Danke für die Hilfe
 
K

kneitzel

Gast
Also generell ist dies über Reflection denkbar. Aber das sehe ich nicht als so Sinnvoll an.

Ich hatte in der Vergangenheit schon Lösungen, bei denen ich die Daten selbst dynamisch halten musste und da habe ich dann Daten z.B. in einer Map abgelegt. Dies wäre aber ein komplett anderes Design, das schon recht speziell ist und das wird bei dir auch nicht unbedingt passen.

Was evtl. bei Dir helfen könnte, wäre ggf. eine Map, welche zu jedem feld Namen dann den Getter speichert (Oder was Du sonst noch so brauchst). Ein kleines, minimales Beispiel dafür wäre:
Code:
import java.util.HashMap;
import java.util.Map;
import java.util.function.Supplier;

public class Example {
    private String someField;
    public String getSomeField() { return someField; }
    public void setSomeField(String someField) {this.someField = someField; }


    public static void main(String[] args) {
        Example test = new Example();
        test.setSomeField("Test Value");

        Map<String, Supplier<String>> fields = new HashMap<>();
        fields.put("someField", test::getSomeField);

        System.out.println(fields.get("someField").get());
    }
}

Also Example soll einfach par Felder mit Getter/Setter haben, hier nur ein einziges "someField".
Zugriff auf Properties über den Namen:
a) Map, in dem die Getter zu jedem Feld gespeichert werden (Supplier<T>).
b) Die Map muss natürlich gefüllt werden, das schreibt man dann an eine Stelle.
c) Da, wo es gebraucht wird, kann dann auf die Getter zugegriffen werden.

Es lohnt sich, java.util.function näher anzusehen, denn da gibt es viele nützliche Dinge, denn ggf. will man ja nicht nur den Getter sondern auch den Setter oder eine andere Funktion speichern...
 
mrBrown

mrBrown

Super-Moderator
Mitarbeiter
Aus ConditionState machst du ein Predicate, dann reduzieren sich die vier ifs schon mal auf eins.

ruleConditionComponent kannst du eine Function<DeinObject, IrgendeinTyp> geben, die dir aus dem Object das Feld zurückgibt.


Ergibt dann etwa:
Java:
T field = ruleConditionComponent.getter.apply(newObjectForCheck); //Entspricht dem Getter-Aufruf
return ruleConditionComponent.state.test(field); entspricht deinen 4 ifs

Das ganze kann man dann noch in ruleConditionComponent auslagern, sodass man am Ende ein einzelnen ruleConditionComponent.test(newObjectForCheck) hat.


EDIT: das ganze kombiniert man sinnvollerweise mit @kneitzel's Map, falls man das ganze irgendwie serialisieren muss, damit hast du dann noch die Abbildung String<->Getter, die du brauchst, um ruleConditionComponent in Menschenlesbarer Form zu speichern.
 
B

beta20

Top Contributor
Danke...

Map<String, Supplier<String>> fields = new HashMap<>();
fields.put("someField", test::getSomeField);
}
}
[/code]

Was macht denn "test::getSomeField" ? Kenne diese Syntax nicht...

Also im Moment habe ich mir ein Enum angelegt für die verschiedenen Properties:

Java:
public enum EntityField {

        NAME("NAME", "Name"), //
        
        ; //

        /////////////////////////

        private String fieldName;
        private String languageName;

        /////////////////////////

        private EntityField(String fieldName, String languageName) {
            this.fieldName = fieldName;
            this.languageName = languageName;
        }

        public String getFieldName() {
            return fieldName;
        }

        public void setFieldName(String fieldName) {
            this.fieldName = fieldName;
        }

        public String getLanguageName() {
            return languageName;
        }

        public void setLanguageName(String languageName) {
            this.languageName = languageName;
        }

    }
 
Thallius

Thallius

Top Contributor
Ich kann nicht verstehen welches Konzept hinter so etwas stehen soll. Ich habe noch nie so etwas gebraucht. Klar kann man alles machen aber ich sehe bei sowas immer ein grundsätzliches Designproblem der Software viel weiter vorher.
 
mrBrown

mrBrown

Super-Moderator
Mitarbeiter
Ich kann nicht verstehen welches Konzept hinter so etwas stehen soll. Ich habe noch nie so etwas gebraucht. Klar kann man alles machen aber ich sehe bei sowas immer ein grundsätzliches Designproblem der Software viel weiter vorher.
z.B. Filtern nach vom Benutzer ausgewählten Bedingungen.
Im einfachsten Fall kann der Nutzer das Feld angeben und den Inhalt vergleichen, schon ist man bei dem da oben.
 
mrBrown

mrBrown

Super-Moderator
Mitarbeiter
Tolle Useability. Da würde ich ein Popup machen mit allen Feldern zum selektieren.
Meine Aussage ist keine zur Usabiility oder zur konkreten Umsetzung.
Deine Umsetzung mit Popup und Feld selektieren ist einfach nur eine Umsetzung von "Nutzer kann das Feld angeben", eben das passendes Feld selektieren.
Für sinnvolles Filtern ist das aber zu wenig, das erlaubt nur sowas wie "Alle Nutzer mit Nutzernamen"

Im Hinterkopf hatte ich dabei Dropdown für Feld, Dropdown für Art des Vergleichs (!=, ==, contains, ...) und Feld für die Eingabe, womit verglichen werden soll. Erlaubt Abfragen wie "Alle Nutzer mit Nutzername gleich Thallius".
Dafür braucht man mindestens diese drei Möglichkeiten auch irgendwie in der UI, Umsetzungen gibt es da viele, eine andere wäre zB, das der Nutzer das direkt als String eingibt, in SQL-ähnlicher Syntax, wie zb google oder github das erlauben.
In jedem Fall muss man aber irgendwie drei Dinge angeben können (wobei sich das Einschränken lässt auf ein oder zwei, je nach Datentyp, zB bei Booleans).


Schon biste das Problem wieder los....
Mit einem "Popup, in dem man Felder selektieren kann", hast du in keinster Weise die Logik dahinter modelliert und umgesetzt - das Problem ist also noch genauso vorhanden.

Wie würdest du das ganze denn modellieren? Ich würde mich wirklich über eine einfachere Variante als die bisherigen drei hier im Thread freuen...
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Warum erfolgt folgende Ausgabe und warum? Java Basics - Anfänger-Themen 4
D Folgende Fehlermeldung bei der Installation von JAVAFX Java Basics - Anfänger-Themen 1
A Folgende Nullen einer Kommazahl aus String entfernen Java Basics - Anfänger-Themen 3
B was bedeuten folgende warnungen in eclipse.. Java Basics - Anfänger-Themen 2
Y Was macht folgende Regular Expression Java Basics - Anfänger-Themen 2
M Wie bilde ich folgende Java Klassen in UML ab Java Basics - Anfänger-Themen 2
M java applet für für folgende onlineapplikation sinvoll? Java Basics - Anfänger-Themen 3
A Was bedeutet folgende Programmcodezeile genau Java Basics - Anfänger-Themen 6
H Datenstruktur für folgende Daten Java Basics - Anfänger-Themen 8
G Warum ist der folgende Code korrekt? Java Basics - Anfänger-Themen 2
O if Abfrage erkennt String nicht Java Basics - Anfänger-Themen 1
NeoLexx Abfrage mit instanceof führt zu unerwarteten Wert Java Basics - Anfänger-Themen 9
N Bedinugng If-Abfrage wird nie erfüllt Java Basics - Anfänger-Themen 4
L boolean-Abfrage enumeration Java Basics - Anfänger-Themen 3
Y Methoden Wie kann ich eine if-Abfrage bei Setters bauen? Java Basics - Anfänger-Themen 6
S Streams - Abfrage absteigend sortieren Java Basics - Anfänger-Themen 11
F If Abfrage gibt falsches Ergebnis.... Java Basics - Anfänger-Themen 6
F POST-Request mit json - Abfrage mit Java Java Basics - Anfänger-Themen 2
C Javafunktion zur Abfrage eines Quellcodes Java Basics - Anfänger-Themen 15
A JOPtionPaneOptionDialog Abfrage welcher Button gedrückt wurde? Java Basics - Anfänger-Themen 8
G if Abfrage: Nicht jeder Fall berücksichtigt Java Basics - Anfänger-Themen 2
I Nur auf Abfrage von einer Text Datei einlesen Java Basics - Anfänger-Themen 11
J Erste Schritte if Abfrage von JButton in 2. Klasse Java Basics - Anfänger-Themen 27
S If Abfrage nur mit bestimmter Initialisierung? Java Basics - Anfänger-Themen 8
Z Boolean Abfrage in einer for each Schleife Java Basics - Anfänger-Themen 2
deatzi Variable aus If Abfrage später nutzen Java Basics - Anfänger-Themen 4
C Instanz einer Klasse während if-Abfrage erzeugen und bei zweiter if-Abfrage wiederverwenden Java Basics - Anfänger-Themen 6
S Backspace Abfrage funktioniert nicht Java Basics - Anfänger-Themen 4
F Interface JFrame mit if-Abfrage automatisch schließen lassen? Java Basics - Anfänger-Themen 3
R Abfrage von Variablen in Unterklassen einer ArrayList Java Basics - Anfänger-Themen 9
G Passwort und Passwort wiederholen in if-Abfrage vergleichen Java Basics - Anfänger-Themen 15
P Altklausur: Abfrage der Summe Java Basics - Anfänger-Themen 9
N Methoden Attribut Abfrage eines anderen Objektes Java Basics - Anfänger-Themen 36
D MySQL Abfrage in JTable speichern Java Basics - Anfänger-Themen 43
D SQL Abfrage anpassen Java Basics - Anfänger-Themen 17
H For-Schleife innerhalb If-Abfrage? Java Basics - Anfänger-Themen 3
F Abfrage ob Eingabe eine Zahl ist Java Basics - Anfänger-Themen 3
O Datentypen Volle 16 Bit eines Short für flags Abfrage nutzen Java Basics - Anfänger-Themen 11
S Input/Output Doppelte Input-Abfrage Java Basics - Anfänger-Themen 3
S Input/Output Programm läuft nach input-Abfrage nicht weiter. Java Basics - Anfänger-Themen 2
M Variablen Eine etwas andere if Abfrage ! Java Basics - Anfänger-Themen 10
H if-Abfrage, ungleich und falscher true Wert? Java Basics - Anfänger-Themen 11
F Ja Nein Abfrage und andere Probleme Java Basics - Anfänger-Themen 5
OlafHD Fehler Bei der if Abfrage Java Basics - Anfänger-Themen 5
quecksilver if-Abfrage in main ausführen Java Basics - Anfänger-Themen 4
D if-Abfrage Java Basics - Anfänger-Themen 12
J Abfrage für Programmwiederholung Java Basics - Anfänger-Themen 2
K Alternative zur If-Abfrage Java Basics - Anfänger-Themen 3
M Java als Webanwendung mit Datenbank abfrage Java Basics - Anfänger-Themen 3
D Abfrage ob Variableninhalt korrekt Java Basics - Anfänger-Themen 5
W Vergleich mit If-Abfrage nur für Zahlen bis 07 möglich - Warum? Java Basics - Anfänger-Themen 7
D Operatoren IF Abfrage liefert falsches Ergebnis Java Basics - Anfänger-Themen 4
X Ja nein abfrage? Java Basics - Anfänger-Themen 9
A Erste Schritte Problem bei meiner if-Abfrage! Java Basics - Anfänger-Themen 5
M Enum-Variabel-Abfrage funktioniert nicht? Java Basics - Anfänger-Themen 2
S Java Counter: nur 1 mal hochzählen auch wenn Abfrage mehrmals zutrifft. Java Basics - Anfänger-Themen 1
E Erste Schritte [Noob-Frage] Meine If-Abfrage macht nicht, was sie soll... Java Basics - Anfänger-Themen 2
C Abfrage nach einem Bild im Array Java Basics - Anfänger-Themen 9
A Key Event - Abfrage von 2 gedrückten Tasten Java Basics - Anfänger-Themen 6
T Klasse für Google-Abfrage Java Basics - Anfänger-Themen 9
Z If abfrage - Minimum 0 Java Basics - Anfänger-Themen 9
J Abfrage versetzen Java Basics - Anfänger-Themen 2
D Methoden Abfrage ob ein Wert bereits vorhanden ist Java Basics - Anfänger-Themen 1
thet1983 if() Abfrage Java Basics - Anfänger-Themen 2
A charAt(x)-Abfrage lässt bei Strings<x das Pgrogramm abstürzen. Kann man das verhindern? Java Basics - Anfänger-Themen 4
Uzi21 if - else Abfrage Java Basics - Anfänger-Themen 6
T Index-Abfrage von Pi Java Basics - Anfänger-Themen 5
H Erste Schritte If Abfrage Java Basics - Anfänger-Themen 3
B If Abfrage mit Passwort und Username Java Basics - Anfänger-Themen 2
U einlesen, abfrage Java Basics - Anfänger-Themen 25
T SQL Abfrage Läuft nicht Java Basics - Anfänger-Themen 5
N Probleme mit ActionListener und Logischer Abfrage Java Basics - Anfänger-Themen 4
F Erste Schritte IF-Abfrage fehlerhaft Java Basics - Anfänger-Themen 9
O Downloaden: Trotz If Abfrage wird Datei heruntergeladen Java Basics - Anfänger-Themen 2
D jProgressBar soll bei 100% sein wenn sql Abfrage inkl. jTable schreiben fertig ist... Java Basics - Anfänger-Themen 5
H if-Abfrage double wert Java Basics - Anfänger-Themen 5
M Erstes Prog. OS Abfrage Java Basics - Anfänger-Themen 9
I Einlese Abfrage zweier Variablen in einem Fenster Java Basics - Anfänger-Themen 6
B Boolean abfrage Java Basics - Anfänger-Themen 3
D Variablen Rücksprung nach If Abfrage Java Basics - Anfänger-Themen 16
T If- Abfrage Java Basics - Anfänger-Themen 8
P Taschenrechner , IF-Abfrage Java Basics - Anfänger-Themen 12
D if-Abfrage Java Basics - Anfänger-Themen 6
G Einfache if-Abfrage der Main-Argumente Java Basics - Anfänger-Themen 3
C If abfrage zu getBackground Java Basics - Anfänger-Themen 2
T abfrage eines Integer Array s Java Basics - Anfänger-Themen 5
feardorcha boolean array false - true - Abfrage Java Basics - Anfänger-Themen 10
G Adminrechte abfrage Java Basics - Anfänger-Themen 5
S Abfrage Objekt-Array nach Datentypen Java Basics - Anfänger-Themen 6
R If-Abfrage, || funktioniert nicht Java Basics - Anfänger-Themen 4
S TabbedPane: nach Abfrage oldTab selektieren Java Basics - Anfänger-Themen 5
B Abfrage mittels Variable vereinfachen Java Basics - Anfänger-Themen 6
C Treffer Abfrage Java Basics - Anfänger-Themen 19
M nach jar export keine db abfrage möglich Java Basics - Anfänger-Themen 2
T Datenbank Abfrage Exception Null Java Basics - Anfänger-Themen 2
J Erste Schritte Im Tante-Emma-Laden mehrere Artikel kaufen mit if-Abfrage Java Basics - Anfänger-Themen 24
I Threads If-Abfrage vor kritischem Abschnitt Java Basics - Anfänger-Themen 4
R Switch Abfrage: Found boolean but expected int? Java Basics - Anfänger-Themen 7
K Kleines Anfänger Problem bei der Abfrage Java Basics - Anfänger-Themen 8
C if else Abfrage Java Basics - Anfänger-Themen 11

Ähnliche Java Themen

Anzeige

Neue Themen


Oben