Eigenschaft über Parameter auslesen und ändern

RezaScript

Bekanntes Mitglied
Hallo,

Ich möchte eine Eigenschaft an einer Funktion übergeben und diese Funktion soll deren Wert ändern können.

Beispiel:
Java:
private String text = "Hi";

public void say() {
    modifiyString(text);
}

private void modifyString(String string) {
    this.string = "Hello";
}

modifyString() soll also über den Parameter erfahren, um welche Eigenschaft es sich handelt. this.string würde in diesem Fall nicht funktionen.

In anderen Programmiersprachen macht man das z.B. mit this{string}. Wie funktioniert das mit Java?
 

Oneixee5

Top Contributor
Zum grundlegenden Verständnis: String ist nicht änderbar (immutable). Es ist also nur möglich einer String-Variablen einen neuen String zuzuweisen.
Java:
public class Example {

    private String text = "Hi";

    public void modifyString() {
        this.text = "Hello";
    }

    public void modifyString(final String parameter) {
        this.text = parameter;
    }


    public static void main(final String[] args) {
        final Example e = new Example();
        System.out.println(e.text);

        e.modifyString();
        System.out.println(e.text);

        e.modifyString("was anderes");
        System.out.println(e.text);

    }
}
 

temi

Top Contributor
Du möchtest den Namen einer Eigenschaft der Klasse, in dem Beispiel "text", an eine Methode übergeben, und die soll daran etwas ändern? Ist das richtig so?

In Java geht das über Reflection, aber vielleicht gibt es einen besseren Weg, wenn du erläutern kannst, was du genau erreichen möchtest.

EDIT: Ok, vielleicht habe ich das auch falsch verstanden. Falls du der Eigenschaft "text" einen anderen Wert zuweisen möchtest, dann geht das so, wie es @Oneixee5 gezeigt hat.
 

Robertop

Bekanntes Mitglied
Wenn das wirklich so gemeint ist, dass der Parameter von modifyString der Name des Strings in der Klasse sein soll (also in deinem Fall "text"), dann würde das mit Reflection zum Beispiel so gehen:

Java:
    private void modifyString(String string)
            throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {
        Field field = this.getClass().getDeclaredField(string);
        field.set(this, "Hello!");
    }
Aber wie @temi schon erwähnt hat, und man ja auch an den vielen Exceptions erkennt, die da geworfen werden können, gibt es wahrscheinlich einen besseren Weg für deinen Anwendungsfall.
 

Oneixee5

Top Contributor
Wenn ein Objekt mit flexiblen Eigenschaften benötigt wird, kann man dafür auch eine Map verwenden.
Java:
public class Example {

    private final HashMap<String, String> map = new HashMap<>();

    public String get(final Object key) {
        return this.map.get(key);
    }

    public String put(final String key, final String value) {
        return this.map.put(key, value);
    }
    
    // andere Eigenschaften von Example

    public static void main(final String[] args) {

        final Example e = new Example();
        System.out.println(e.get("text")); // null

        e.put("text", "das ist mein Text");
        System.out.println(e.get("text")); // das ist mein Text
    }
}
 

RezaScript

Bekanntes Mitglied
Ok das mit String war nur ein Beispiel. In meinem Fall möchte ich den Parameter mode mit Typ MediaPlayer auf null setzen.

Ich habe es mal so ausprobiert:

Java:
private void turnOffMode(MediaPlayer mode) {
    if (mode.isPlaying()) {
        mode.stop();
        mode.reset();
        mode.release();

        // Setze this.mode auf null
        Field field = null;
        try {
            field = this.getClass().getDeclaredField(String.valueOf(mode));
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }
        try {
            Objects.requireNonNull(field).set(this, null);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}

Bekomme aber den Fehler
W/System.err: java.lang.NoSuchFieldException: No field android.media.MediaPlayer@d9ec67a
 

LouCyphre

Bekanntes Mitglied
Ich bin mir nicht sicher, aber kann es sein dass die Exception geworfen wird, weil field ja eben null ist?

Ich kann mir auch noch vorstellen, dass mode nicht als field gelesen werden werden kann. Vllt casten versuchen oder so. Nur Gedanken, alles ohne Gewähr!
 

LimDul

Top Contributor
Ok das mit String war nur ein Beispiel. In meinem Fall möchte ich den Parameter mode mit Typ MediaPlayer auf null setzen.

Ich habe es mal so ausprobiert:

Java:
private void turnOffMode(MediaPlayer mode) {
    if (mode.isPlaying()) {
        mode.stop();
        mode.reset();
        mode.release();

        // Setze this.mode auf null
        Field field = null;
        try {
            field = this.getClass().getDeclaredField(String.valueOf(mode));
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }
        try {
            Objects.requireNonNull(field).set(this, null);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}

Bekomme aber den Fehler
Was immer du da tust - es ist nicht sinnvoll.

Wenn du this.mode auf null setzen willst:
Java:
this.mode = null;
 

RezaScript

Bekanntes Mitglied
Also ich hab mich für den klassischen Weg entschieden, und zwar mit Getters und Setters.

Das Ganze habe ich dann so gelöst:

Java:
private void turnOffMode(MediaPlayer getter, Runnable setter) {
    if (getter.isPlaying()) {
        getter.stop();
        getter.reset();
        getter.release();
        setter.run();
    }
}
 

temi

Top Contributor
In meinem Fall möchte ich den Parameter mode mit Typ MediaPlayer auf null setzen.
Ich bin mir nicht sicher, ob die Beschreibung zu dem passt, was du machen willst.
Java:
private void turnOffMode(MediaPlayer mode) { // <== hier ist der Parameter mit dem Bezeichner "mode"
Wenn du den auf null setzen willst, dann mach einfach:
Java:
private void turnOffMode(MediaPlayer mode) {
    mode = null;
  
    //...
}

Aber vermutlich möchtest du etwas anderes machen, als das, was du beschrieben hast, denn das ist relativ sinnlos.

Java:
public class Something {
    
    private MediaPlayer mode; // <== das ist die Eigenschaft (oder Instanzvariable) mit dem Namen "mode"

    private void turnOffMode(MediaPlayer mode) {
        mode = null; // setzt den Parameter "mode" auf null
        
        this.mode = null; // setzt die Eigenschaft "mode" auf null
    }
}
 
Zuletzt bearbeitet:

temi

Top Contributor
Ups, noch zur Klarstellung: Das letzte Beispiel im vorherigen Beitrag (#11) dient nur der Klärung der Begriffe "Eigenschaft" und "Parameter", sowie dem jeweiligen Zugriff darauf. Es ist natürlich weiterhin ziemlich sinnlos.
 

RezaScript

Bekanntes Mitglied
Wenn ich mir das so anschaue, dann bin ich mir nicht sicher, ob du Getter und Setter richtig verstanden hast. Das sieht irgendwie komisch aus.
Erkläre bitte, was genau hier für dich "komisch" aussieht.


@temi ich glaube, du hast nicht ganz verstanden, worum es geht. In der Funktion möchte ich den Wert der Eigenschaft ändern und nicht den Wert des Parameters. Klar, in deinem Beispiel würde this.mode = null; gut funktionieren, aber nur wenn die Funktion den Namen der Eigenschaft (in deinem Fall this.mode) kennt, tut sie aber nicht.

So würde dein Code also nicht mehr funktionieren:
Java:
public class Something {
    
    private MediaPlayer secret;

    // Ich bin nur eine Funktion, die keine Eigenschaften kennt
    // Wenn du willst, dass ich etwas mit einer Eigenschaft mache
    // dann gebe die Eigenschaft als Parameter ein
    private void turnOffMode(MediaPlayer mode) {         
        this.mode = null; // this.secret soll auf null gesetzt werden
    }
}
 

temi

Top Contributor
ich glaube, du hast nicht ganz verstanden, worum es geht.
Tatsächlich war das aus deinen Angaben nicht sehr eindeutig zu erkennen, aber es ist wohl so, wie in #3 vermutet. Du möchtest als Parameter den Namen der Eigenschaft angeben und diesen dann, wie auch immer, ändern.

Die Antwort hast du erhalten. Das geht mit Reflection, siehe das Beispiel in #5. Du hast das ja auch versucht (in #6), aber der Name der gewünschten Eigenschaft muss natürlich als String-Parameter übergeben werden und nicht als MediaPlayer. Der Aufruf der Methode könnte in dem Fall turnOffMode("secret") lauten.

Erkläre bitte, was genau hier für dich "komisch" aussieht.
"Klassische" Getter und Setter sehen für mich so aus:
Java:
class Foo {
    private int value = 42;

    public void setValue(int value) { // Setter
        this.value = value;
    }

    public int getValue() { // Getter
        return value;
    }
}

Du hast zwei Parameter, denen du die Bezeichnung "getter" und "setter" gegeben hast.
 

RezaScript

Bekanntes Mitglied
@temi den Code von Getters und Setters habe ich in meinem Post von #9 nicht noch extra hinzugefügt, da jedem bewusst sein soll, was mit Getters und Setters gemeint ist. Hier aber bitte den ganzen Code:

Java:
private MediaPlayer myMode = null;

public MediaPlayer getMyMode() {
   return myMode;
}

public void setMyMode(MediaPlayer myMode) {
   this.myMode = myMode;
}

public void doSumth() {
    // this.myMode ist nicht mehr null und soll wieder auf null gesetzt werden
    turnOffMode(getMyMode(), () -> setMyMode(null));
}

private void turnOffMode(MediaPlayer getter, Runnable setter) {
    if (getter.isPlaying()) {
        getter.stop();
        getter.reset();
        getter.release();
        setter.run();
    }
}
 

mrBrown

Super-Moderator
Mitarbeiter
@temi den Code von Getters und Setters habe ich in meinem Post von #9 nicht noch extra hinzugefügt, da jedem bewusst sein soll, was mit Getters und Setters gemeint ist. Hier aber bitte den ganzen Code:
Nein, wenn zwei Parameter getter und setter heißen, aber beide von der Signatur her schon keine Getter/Setter sein können, weil ehrlich gesagt niemand, was du damit meinen könntest...

Sowas: getter.stop(), oder sowas: setter.run() liest sich einfach sehr, verzeih den Ausdruck, scheiße, und lässt einen erstmal daran zweifeln, ob du verstanden hast, was Getter und Setter sind.

Wenn man die Parameter umbenennt, zB in einfach nur mediaPlayer und releaseAction, macht das für Leser schon deutlich mehr Sinn.


Noch einfacher wäre aber, mit sinnvoller Kapselung zu arbeiten:
Java:
if (myMode != null &&myMode.isPlaying()) {
        myMode.stop();
        myMode.reset();
        myMode.release();
        myMode = null;
 }

Das diese paar Zeilen in einer anderen Klasse stehen (wodurch die Übergabe eines Runnables zum setzen auf null überhaupt nötig wäre), sieht nach seht schlechter Kapselung aus, und ist etwas, was man eher durch besseres Design löst, anstatt durch solche Tricks.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
U Eigenschaft eines JTextfiels per ActionListener ändern... Java Basics - Anfänger-Themen 2
G Woher kommt diese Eigenschaft Java Basics - Anfänger-Themen 5
K Klasse mit einer Array-Eigenschaft Java Basics - Anfänger-Themen 4
P Eigenschaft eines imperativen Algo (Pseudocode) sofort erkennen Java Basics - Anfänger-Themen 1
F Alle Objekte einer Klasse nach Eigenschaft durchsuchen Java Basics - Anfänger-Themen 8
J Erste Schritte Zugriff auf Eigenschaft Java Basics - Anfänger-Themen 2
G Wo ist die Eigenschaft dieses JFrames versteckt? Java Basics - Anfänger-Themen 5
H Suche spezifische Eigenschaft von Object - sowas wie ".hashCode()" Java Basics - Anfänger-Themen 4
G Eigenschaft einer anderen Klasse Java Basics - Anfänger-Themen 5
richis-fragen GlassPane über JScrollPane legen Java Basics - Anfänger-Themen 6
A Server - Client Nachrichtenaustausch über Eventbus Java Basics - Anfänger-Themen 12
P Neue Java v8 JRE Version nicht über alte drüber installierbar: Wie sonst? Java Basics - Anfänger-Themen 7
D Downloadfortschritt von Datei über Google Drive API v3 Java Basics - Anfänger-Themen 10
B großzügiges Pixelraster über Bildschirm legen Java Basics - Anfänger-Themen 7
ravenz Schleife mit for über String Array „zahlen“und prüfen ob Wert „a“ oder „b“ oder „c“ entspricht (mittels || ) Java Basics - Anfänger-Themen 4
L Beim Java Programmstart, mehrere Parameter über die Kommandozeile übergeben Java Basics - Anfänger-Themen 9
sserio Iterierung über ein zweidimensionales Array Java Basics - Anfänger-Themen 16
H Eine Methode über Actionlistener beenden Java Basics - Anfänger-Themen 8
S Java über SSH Java Basics - Anfänger-Themen 13
X Wie erreiche ich, dass ein Robot weitere Attribute hat, die nicht materialisiert sind, sondern nur über get/ set-Methoden simuliert sind? Java Basics - Anfänger-Themen 1
M Wie können Klassen nicht-materialisierte Attribute haben, die nur über get/ set-Mehoden simuliert sind? Java Basics - Anfänger-Themen 6
D Best Practice Ausgabe über direkte Ausgabe oder try-catch? Java Basics - Anfänger-Themen 13
P Datei einlesen, nach Begriff filtern und in Datei ausgeben. Problem Standardausgabe über Konsole Java Basics - Anfänger-Themen 19
W Unterschiede bei Zugriff auf Objekt und Klassenvariablen über einen Getter? Java Basics - Anfänger-Themen 2
W char über die Konsole? Java Basics - Anfänger-Themen 7
EchtKeineAhnungManchmal Hallo :) ich bekomme es nicht hin eine Fehlermeldung auszugeben über die GUI Java Basics - Anfänger-Themen 3
S Array über ein Ausgabemethode in main ausgeben Java Basics - Anfänger-Themen 31
C Potenzberechnung über switch case. Taschenrechner mit Eingabe über einen grafischen Dialog Java Basics - Anfänger-Themen 22
J Wert zurückgeben über get Methode Java Basics - Anfänger-Themen 8
J Eintrag Combobox über einen String auswählen Java Basics - Anfänger-Themen 3
A Array Ansprache einer Zelle über Punktnotation? Java Basics - Anfänger-Themen 3
O Java über cmd benutzen ? Java Basics - Anfänger-Themen 5
J Variablenzugriff über string Java Basics - Anfänger-Themen 18
W Objekte über Scanner Input; ToString Probleme... Java Basics - Anfänger-Themen 4
H Methode über String Wert aufrufen Java Basics - Anfänger-Themen 8
M Java Kompilieren über Package grenzen hinaus Java Basics - Anfänger-Themen 4
M Arrays mit mehreren Werten über JOptionPane initialisieren Java Basics - Anfänger-Themen 12
Tino1993 Ellipse über draw Funktion ohne spur wandern lassen Java Basics - Anfänger-Themen 6
M Mehrere Datenbank zugriffe über tomee.xml regeln? Java Basics - Anfänger-Themen 1
N Input/Output Eine Frage über system.out.println. Java Basics - Anfänger-Themen 10
J Array über Getter erlangen Java Basics - Anfänger-Themen 34
S While-Schleife geht in Endlosschleife über, warum? Java Basics - Anfänger-Themen 6
B OOP-Anfänge über CMD + Editor Java Basics - Anfänger-Themen 30
G Variablen Array Länge über den Konstruktor definieren Java Basics - Anfänger-Themen 4
L Addition von Arrays über die Parameterliste Java Basics - Anfänger-Themen 11
C Datei über relative Pfade einlesen Java Basics - Anfänger-Themen 6
1 Erste Schritte Was denkt ihr über eines meiner ersten Javaprogramme? Java Basics - Anfänger-Themen 2
S Allgemeine Frage über Generics und Vererbungen Java Basics - Anfänger-Themen 5
J Button über Pfeiltasten bewegen Java Basics - Anfänger-Themen 8
E Objekt durch Benutzer über Konsole erzeugen - Java Java Basics - Anfänger-Themen 3
N Eingabe Kommazahlen über Scanner Java Basics - Anfänger-Themen 2
T DoWhile Schleife über mehrere Mothoden Java Basics - Anfänger-Themen 5
C Collections List über Interface zugreifen Java Basics - Anfänger-Themen 32
J Gefilterten Stream über die Konsole ausgeben Java Basics - Anfänger-Themen 1
S Variablen Klassenvariable über Objekt aufrufen Java Basics - Anfänger-Themen 16
S Bilder über Socket Senden Java Basics - Anfänger-Themen 1
K Textdatei auslesen und über Mqtt schicken Java Basics - Anfänger-Themen 4
L Iterieren über eine CSV Datei Java Basics - Anfänger-Themen 7
I GUI über Eclipse oder NetBeans Java Basics - Anfänger-Themen 23
S Klassenaufruf über JFrame Button Java Basics - Anfänger-Themen 3
Java The Hutt SetWerte über verschiedene Klassen Java Basics - Anfänger-Themen 16
L Zugriff auf Attribute eins Objekts über ActionListener Java Basics - Anfänger-Themen 4
O Methode über Leerzeichen Java Basics - Anfänger-Themen 13
I OOP Objektnamen über die Konsole richtig einlesen Java Basics - Anfänger-Themen 9
A Variablen Variablenwert über Konstruktor ändern Java Basics - Anfänger-Themen 3
J MySQL Datumsabfrage über ResultSet in Java-Servlet Java Basics - Anfänger-Themen 4
CptK Interface Bilder über Bildschirm bewegen, bis der Abstand zum vorherigen zu groß wird Java Basics - Anfänger-Themen 13
dapzoo Class File Version zu niedrig? Ausführen über Eingabeaufforderung nicht möglich Java Basics - Anfänger-Themen 14
J Punkt auf,über,unter oder zwischen 2 Geraden Java Basics - Anfänger-Themen 14
CptK Interface Bild über Methode ändern funktioniert nicht Java Basics - Anfänger-Themen 4
R Keine Verbindung zu MySql über Netbeans Java Basics - Anfänger-Themen 15
E Best Practice Jar-file mit zwei Klassen und externer Bibliothek über Konsole erzeugen Java Basics - Anfänger-Themen 13
J Aufruf einer Methode über einen String Java Basics - Anfänger-Themen 11
G Arraynamen über eine Schleife ansprechen Java Basics - Anfänger-Themen 4
S Bild über JButton legen Java Basics - Anfänger-Themen 3
temi Druckeransteuerung über ESC-Sequenz Java Basics - Anfänger-Themen 21
M Methodenaufruf über SQL UPDATE Java Basics - Anfänger-Themen 8
B Könnte jemand über dieses jurze Javaprogramm schauen? Irgendwas funktioniert mit der z-Varible nicht Java Basics - Anfänger-Themen 2
M Java Programm über Batch-Datei ausführen Java Basics - Anfänger-Themen 1
E Wie Passwort-Eingabe (ohne Echo!) über Konsole ? Java Basics - Anfänger-Themen 4
C Erste Schritte Fehler beim *.class Aufruf über cmd.exe Java Basics - Anfänger-Themen 9
R Fragen über den Konstruktor Java Basics - Anfänger-Themen 0
X Minimax-Algorithmus über alle Kanten möglich? - Kanten darstellen Java Basics - Anfänger-Themen 1
P Threads Prozess kann nicht über die GUI gestartet werden Java Basics - Anfänger-Themen 8
T CMD über Java-Programm aufrufen Java Basics - Anfänger-Themen 2
X Finde die Files über FTP nicht Java Basics - Anfänger-Themen 4
J Methode über Scanner aufrufen Java Basics - Anfänger-Themen 15
P Programm kann über CMD nicht ausgeführt werden Java Basics - Anfänger-Themen 2
E Frage über Speichern und Ausgabe Java Basics - Anfänger-Themen 7
J Verschieden Fragen über Java Programmierung Java Basics - Anfänger-Themen 3
X Betriebssytem interne Consolen Commands über Java starten Java Basics - Anfänger-Themen 2
J ArrayList über verschiedene Klassen verwenden Java Basics - Anfänger-Themen 7
A .jar über Webbrowser aufrufen Java Basics - Anfänger-Themen 2
D Ausgabe über JLabel Java Basics - Anfänger-Themen 12
L Erste Schritte Arrays über eine for Schleife ansprechen. Java Basics - Anfänger-Themen 6
MiMa Datentyp Short Wert zuweisen über Methode Java Basics - Anfänger-Themen 2
K Objekt soll Anwendung über Änderungen informieren Java Basics - Anfänger-Themen 8
Detox Class Datei erzeugen nicht möglich über cmd Java Basics - Anfänger-Themen 1
F Gewichteter Mittelwert über eine Zeitperiode Java Basics - Anfänger-Themen 3
B Schleife über einen Container Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Neue Themen


Oben