Ein übergegebenes Objekt auf null setzen

Hag2bard

Bekanntes Mitglied
Im Zuge meiner Ausbildung ist eine Frage aufgetaucht, die mich beschäftigt.

Es geht eigentlich um folgendes Experiment eines Kollegen:

Java:
public class exampleClass {


    StringBuilder builder = new StringBuilder("Hello");

    public void testMethod() {
        setNull(builder);
        System.out.println(builder);
        builder = null;
        System.out.println(builder);
        builder = new StringBuilder("Neuer Stringbuilder");
        System.out.println(builder);
    }

    public void setNull(StringBuilder element) {
        element.append(" World!");
        element = null;
    }
  
    public void setBuilder(StringBuilder builder) {
        this.builder = builder;
    }

}

Die Ausgabe ist:

Code:
Hello World!
null
Neuer Stringbuilder

Erwartete Ausgabe:

Code:
null
null
Neuer Stringbuilder

Meine Idee drehte sich nun darum eine Methode zu schreiben, die mir ein übergebenes Objekt auf null setzt.
Wie könnte das funktionieren?
Ich dachte daran, dass man in der setNull Methode eventuell die Klasse des übergebenden Objekts herausfinden kann, um dann auf den richtigen Setter zuzugreifen.
Also Pseudocode:

Code:
setNull(StringBuilder element) {
String className = element.getClassName;  (Hier hätte ich gerne ein Ergebnis wie "exampleClass")
getInstanceByClassName(className).setBuilder(null);
}

Könnte man das so irgendwie realisieren?

Danke schonmal
 

KonradN

Super-Moderator
Mitarbeiter
Java nutzt bei Parametern immer in Call by Value und nie ein Call by Reference. Daher kannst Du das Übergebene nicht ändern.

Also bei einem Methodenaufruf werden die Inhalte immer kopiert. Wenn die Variable eine Referenz enthält, dann wird die Referenz kopiert. Das macht aber aus dem Aufruf kein "Call by Reference" - Es ist weiterhin ein Call by Value nur eben ist der Wert nun eine Referenz.
 

Hag2bard

Bekanntes Mitglied
Das ist eine Mini-Beispielmethode, ich kenn den genauen Code des Kollegen auch nicht. Aber wenn ich darüber nachdenke, kann ich mir durchaus vorstellen, dass es Szenarien gibt, in denen man (je nach dem was im Programm so passiert) ein Objekt, mit dem in einer Methode gearbeitet wurde dann irgendwann mal auf null gesetzt werden soll.

Gehen wir davon aus, dass ich ein Objekt übergebe, z.B. ein StringBuilder.
Dieser wird nun verarbeitet usw..
Irgendwann entscheidet sich im Laufe der Methode (Z.b.: durch Abbruch einer Handlung durch den User), dass der StringBuilder auf null gesetzt werden soll.
Dann kann ich mir vorstellen, dass so etwas benötigt wird.

Natürlich könnte man einfach eine Methode mit einem Return Wert aufrufen und den Return Wert dann (also das StringBuilder) Objekt verwenden um meinetwegen das ursprüngliche Objekt durch Rückgabe von Null auf Null zu setzen.

Das ist natürlich eine deutlich bessere Vorgehensweise. Aber da ich gerne nach links und rechts schaue und um die Ecke denke, kam mir die Frage auf, wie man eine Methode realisieren könnte, die ein übergebenes Objekt auf null setzt.
 

temi

Top Contributor
Die Methode kann ja das Ergebnis ihrer Verarbeitung als Rückgabewert liefern. Der kann auch null sein...
 

Hag2bard

Bekanntes Mitglied
Richtig, so ergibt es auch viel mehr Sinn und ich denke mein Szenario ist unrealistisch.
Ich kann auch kein Beispiel darstellen, in dem es notwendig ist.
Meine Idee war einfach die Klasse auszulesen, von der das Objekt kommt und dessen Setter aufzurufen (um Null zu übergeben).
Wahrscheinlich muss man das in Java ohne die Existenz von Pointern einfach umschiffen.
 

berndoa

Top Contributor
Das passt ja irgendwie zum Thema was zumindest ich gerade im anderen Thread auf dem Schirm hatte:
Bei einer gegebenen globalen Variable (=steht nicht in einer Methode sondern gaaaaanz oben in der Klasse, also von überall ind er Klasse aus zu erreichen), die nichts primitives ist sondern ein Referenztyp (int ist primitiver Datentyp, String, StringBuilder und Co. nicht),
kannst du zwar in der Methode Eigenschaften des referenzierten Objektes ändern, aber nicht die Referenz an sich da der Parameter der Methode nur eine Kopie ist.


Heißt auch, egal wie du es drehst, du kannst einer Methode nicht eine globale Variable als "input" reingeben (denn in der Methode wird dann mit einer Kopie statt der Originalvariable gearbeitet und der null zuzuweisen geht zwar, ändert aber an der Originalvariable und deren Referenz nix.

An deinem Beispiel:
Java:
public class exampleClass {


    StringBuilder builder = new StringBuilder("Hello");

    public void testMethod() {
        setNull(builder);
        System.out.println(builder);
        builder = null;
        System.out.println(builder);
        builder = new StringBuilder("Neuer Stringbuilder");
        System.out.println(builder);
    }

    public void setNull(StringBuilder element) {
        element.append(" World!");
        element = null;
    }
 
    public void setBuilder(StringBuilder builder) {
        this.builder = builder;
    }

}

Wenn in der TestMethod die setNull Methode aufgerufen wird, passiert Folgendes:
Wir haben ja die globale Variable builder, die auf ein Objekt (den bestimmten StringBuilder, der am Klassenanfang mit new definiert wurde) an einer bestimmten memoryadresse zeigt.

Wird nun die setNull Methode wie hier benutzt, so wird eine neue lokale Variable element erzeugt, die nur innerhalb der Methode existiert und die auf das gleiche Objekt zeigt wie builder.
builder und element zweigen zwar auf das gleiche Objekt, sind aber nicht das Selbe!

Nun weiter was in der Methode passiert:
Mit element.append(...) wird nun das Objekt, auf das element zeigt, verändert (indem ein " World" an den String rangehängt wird).
Das ist locker möglich, da man über die Referenz des Objekts auf dessen methoden, Attribute und so zugreifen kann.

In der nächsten zeile wird element, das bisher auf das Objekt im Speicher gezeigt hat, geändert sodass es auf nichts zeigt (null halt).
element hat also keinen bezug mehr zum Objekt im Speicher.
Das ändert aber nichts dran dass die globale Variable builder nahc wie vor auf das (mitlerweile veränderte) Speicherobjekt zeigt.

Methode endet.
Das Objekt, auf das builder zeigt, wurde zwar erfolgreich verändert, allerdings hat sich an dem, wohin builder zeigt, nix geändert.
Da wir ja immer an einer anderen variable Element rumgewerkelt haben, die nur zufällgi in die selbe Richtung gezeigt hat wie builder :)

Insofern ist da auch nicht verwunderlich dass bei der Ausgabe nach wie vor der Wert des Objekts angezeig5 wird, auf den builder zeigt.
Eben den "Hello World" String.


Hingegen builder=null ändert direkt, worauf builder zeigt.
builder zeigt nun auf gar nix mehr, insbesodnere eben nicht mehr auf das StrignBuilder Objekt von eben.
Daher beim Ausdrucken auch "null".
Hättest übrigens auch setBuilder(null) nutzen können, dann würde eine lokale Variable builder gebaut, die auf nichts zeigt.
Und die globale variable vom gleichen namen würde geädnert werden sodass sie in die gleiche Richtung zeigt.
Nirgendwohin. Methodenende.
(auch) das globale builder zeigt auf null.

Gut und später weisst du null dann wieder eine Richtung zu, es zeigt nun auf ein neues Stringbuilder Objekt (das trotz des gleichen Strigninhalts nichts mit dem Vorherigen zu tun hat!).



Wie Konrad shcon sagte, es ist faktisch unmöglich, sowas wie eine Universalmethode zu bauen, der man eine globale Variable nennt und die die dann auf null setzt.
Da kannst du nur explizit hingehen und in einer Methode eine VAriable ändern, indem du sie konkret beim anmen nennst (und dich eben nicht irgendwie an Methodenparameter orientierst), also sowas wie

Java:
public void setNull(){
    globva=null;
}
Falls die Klasse eine globale Variable namens "globva" hat.

Wobei , aber hier fehlen mir die nötigen kenntnisse, gegebenenfalls könntest du extrem umständlich mit Reflection sowas hinkriegen.
Dass deine Methode also von der Klasse, in der sie sich befindet, die Klassenattribute rausfindet mittels reflection und denen dann null zuweist.
Aber ob das gerade so geht oder gar wie, garich dir nicht sagen.
 

berndoa

Top Contributor
Das ist eine Mini-Beispielmethode, ich kenn den genauen Code des Kollegen auch nicht. Aber wenn ich darüber nachdenke, kann ich mir durchaus vorstellen, dass es Szenarien gibt, in denen man (je nach dem was im Programm so passiert) ein Objekt, mit dem in einer Methode gearbeitet wurde dann irgendwann mal auf null gesetzt werden soll.

Gehen wir davon aus, dass ich ein Objekt übergebe, z.B. ein StringBuilder.
Dieser wird nun verarbeitet usw..
Irgendwann entscheidet sich im Laufe der Methode (Z.b.: durch Abbruch einer Handlung durch den User), dass der StringBuilder auf null gesetzt werden soll.
Dann kann ich mir vorstellen, dass so etwas benötigt wird.

Natürlich könnte man einfach eine Methode mit einem Return Wert aufrufen und den Return Wert dann (also das StringBuilder) Objekt verwenden um meinetwegen das ursprüngliche Objekt durch Rückgabe von Null auf Null zu setzen.

Das ist natürlich eine deutlich bessere Vorgehensweise. Aber da ich gerne nach links und rechts schaue und um die Ecke denke, kam mir die Frage auf, wie man eine Methode realisieren könnte, die ein übergebenes Objekt auf null setzt.
Laut einer stackoverflow Seite kann man vergleichbares mit stringBuilderObj.setLength(0) erreichen, dass also gweissermassen im Stringbuilder hinterlegte String wider entfernt wird.
 

KonradN

Super-Moderator
Mitarbeiter
Also wichtig ist, dass man genau plant, was wo zugreifen soll. Gerade so Dinge sind einfach nicht vorgesehen:
Meine Idee war einfach die Klasse auszulesen, von der das Objekt kommt und dessen Setter aufzurufen

Das Problem ist, dass man ja Dinge gerade kapseln will. Es muss also gar keinen Setter für das geben, das da aufgerufen wurde. Und das ist ja dann eine Abhängigkeit, die nicht wirklich übersichtlich ist.

Es ist also eine Frage, wie man seine Abhängigkeiten deutlich macht. Da geht es dann in der Regel auch nicht um globale Variablen sondern um innere Zustände in einem Objekt. Ohne ein konkretes Szenario ist es aber sehr schwer, hier mögliche Vorgehen zu nennen. Möglichkeiten gibt es viele - angefangen von direkten Abhängigkeiten (dann kennt die eine Instanz die andere und kann da dann z.B. einen Setter aufrufen) hin zu Pattern wie Observer Pattern und Co.

Wobei , aber hier fehlen mir die nötigen kenntnisse, gegebenenfalls könntest du extrem umständlich mit Reflection sowas hinkriegen.
Dass deine Methode also von der Klasse, in der sie sich befindet, die Klassenattribute rausfindet mittels reflection und denen dann null zuweist.
Also es wird sehr schwer, da wirklich etwas heraus zu finden. Reflection geht - man kann sich also sowohl nach Settern umsehen aber auch nach Feldern. Aber man hat es sehr schwer, da die Variable zu finden, die man ändern will. Man muss ja nur schauen:
  • Es kann ja mehrere Felder geben, die auf die gleiche Instanz zeigen. Wir entscheidest Du, welche du auswählst?
  • Es muss ja nicht einmal eine Instanz sein. Es kann ja auch eine lokale Variable sein. Oder evtl. ist es gar keine Variable?
So ein Ansatz ist also nicht wirklich sinnvoll. Zumal man auch etwas die Komplexität und Laufzeit betrachten sollte.
 

berndoa

Top Contributor
Also wichtig ist, dass man genau plant, was wo zugreifen soll. Gerade so Dinge sind einfach nicht vorgesehen:


Das Problem ist, dass man ja Dinge gerade kapseln will. Es muss also gar keinen Setter für das geben, das da aufgerufen wurde. Und das ist ja dann eine Abhängigkeit, die nicht wirklich übersichtlich ist.

Es ist also eine Frage, wie man seine Abhängigkeiten deutlich macht. Da geht es dann in der Regel auch nicht um globale Variablen sondern um innere Zustände in einem Objekt. Ohne ein konkretes Szenario ist es aber sehr schwer, hier mögliche Vorgehen zu nennen. Möglichkeiten gibt es viele - angefangen von direkten Abhängigkeiten (dann kennt die eine Instanz die andere und kann da dann z.B. einen Setter aufrufen) hin zu Pattern wie Observer Pattern und Co.


Also es wird sehr schwer, da wirklich etwas heraus zu finden. Reflection geht - man kann sich also sowohl nach Settern umsehen aber auch nach Feldern. Aber man hat es sehr schwer, da die Variable zu finden, die man ändern will. Man muss ja nur schauen:
  • Es kann ja mehrere Felder geben, die auf die gleiche Instanz zeigen. Wir entscheidest Du, welche du auswählst?
  • Es muss ja nicht einmal eine Instanz sein. Es kann ja auch eine lokale Variable sein. Oder evtl. ist es gar keine Variable?
So ein Ansatz ist also nicht wirklich sinnvoll. Zumal man auch etwas die Komplexität und Laufzeit betrachten sollte.
Mir ging es auch eher drum ob es überhaupt möglich ist, von Effizienz, Laufzeit oder gar Sinn des Ganzen ganz zu schweigen :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Ausgabe einer ArrayList ensteht nur als Hashcode, nicht als Objekt Java Basics - Anfänger-Themen 16
Rxiiz Objekt aus ComboBox entfernen Java Basics - Anfänger-Themen 4
I JSON in Objekt umwandeln Java Basics - Anfänger-Themen 3
P Objekt einer Methode eines anderen Objektes übergeben Java Basics - Anfänger-Themen 5
I Klassen von einem package laden, Statisches Feld auslesen und Objekt erstellen Java Basics - Anfänger-Themen 8
B Objekt aus generalisierter Liste entfernen Java Basics - Anfänger-Themen 11
Soranix Erste Schritte Struktur als Anfänger // Von einer Klasse auf ein Objekt einer anderen Klasse zugreifen. Java Basics - Anfänger-Themen 6
Say Objekt Java Basics - Anfänger-Themen 4
Say abstract class und Objekt erzeugen - Dringend Hilfe Java Basics - Anfänger-Themen 10
T Wie kann man es machen das ein Objekt nicht übermalt wird Java Basics - Anfänger-Themen 2
D OOP Array einem Objekt zuweisen Java Basics - Anfänger-Themen 2
I Entity Objekt nicht gefunden -> Webhook empfangen in der gleichen Methode (Transaktion) Java Basics - Anfänger-Themen 37
K warum kann ich das Objekt nicht erstellen ? Java Basics - Anfänger-Themen 2
K wie kann ich alle Attribute von dem Objekt(pagode) ausgeben lassen ? Java Basics - Anfänger-Themen 3
M BlueJ Objekt in Objektliste Java Basics - Anfänger-Themen 2
B Objekt in Klassendiagramm an fremdes Objekt weiterreichen? Java Basics - Anfänger-Themen 6
Fodoboo131 RegEx- Umwandlung von String in ausführbares Objekt/ Befehl Java Basics - Anfänger-Themen 9
frager2345 Aufgabe Hash Objekt Elemente ausgeben Java Basics - Anfänger-Themen 2
amelie123456 Objekt Farbe Quellcode Java Basics - Anfänger-Themen 4
M Objekt in einem Objekt speichern Java Basics - Anfänger-Themen 9
U Warum kann ich, auf private Variablen zugreifen, wenn ich ein Objekt in der Klasse, die private Variablen hat erstelle und dort drauf zugreifen will? Java Basics - Anfänger-Themen 7
missy72 Klassen Objekt Array NullPointerException Java Basics - Anfänger-Themen 3
J Hinzufügen eines Objektes in ein Objekt-Array Java Basics - Anfänger-Themen 62
O Warum bekommen wir nicht die Referenz vom zurückgegebenen Objekt? Java Basics - Anfänger-Themen 4
K Ein Objekt Auto kennt den Inhalt seines links und rechtsstehenden Autos, wie soll man das ermöglichen Java Basics - Anfänger-Themen 2
W Unterschiede bei Zugriff auf Objekt und Klassenvariablen über einen Getter? Java Basics - Anfänger-Themen 2
melaniemueller Fernseher als Objekt Java Basics - Anfänger-Themen 9
B Datentyp für Einzelnes Objekt oder Liste Java Basics - Anfänger-Themen 9
Nina Pohl Ein Vorgang bezog sich auf ein Objekt, das kein Socket ist Java Basics - Anfänger-Themen 6
B Objekt kopieren und sämtliche Referenzen von diesem Objekt? Java Basics - Anfänger-Themen 3
S JavaFX - Objekt an neue Stage übergeben Java Basics - Anfänger-Themen 12
T Verständnisfrage Objekt Getter Setter Java Basics - Anfänger-Themen 102
P Objekt in mehreren Methoden verwenden. Java Basics - Anfänger-Themen 3
S Aufzurufendes Objekt Java Basics - Anfänger-Themen 3
CptK Überprüfen ob übergebenes Objekt zu Generics passt Java Basics - Anfänger-Themen 2
C Konstruktor ab serialisiertem Objekt Java Basics - Anfänger-Themen 4
Kalibru Problem bei Ausgabe von Objekt Java Basics - Anfänger-Themen 1
P Wie rufe ich Methoden mit einer Referenz auf eine Klasse||Objekt auf Java Basics - Anfänger-Themen 4
J Input/Output Konstruktor ergänzen, der zur Datei mit einem Objekt passt Java Basics - Anfänger-Themen 0
P Ein Objekt nach einem String durchsuchen? Java Basics - Anfänger-Themen 7
S Objekt aus Arraylist in andere Arraylist kopieren? Java Basics - Anfänger-Themen 2
J Objekt-Array dynamischer Länge aus Benutzereingaben erstellen Java Basics - Anfänger-Themen 6
W Mehrfach das gleiche Attribut für ein Objekt erzeugen (mit verschiedenen Werten) Java Basics - Anfänger-Themen 2
C Arrays - deklarieren, initialisieren? Ist das ein Objekt? Java Basics - Anfänger-Themen 3
B Interface List - Objekt übergeben? Einzelnes Objekt geht, aber Liste nicht? Java Basics - Anfänger-Themen 4
B Objekt von EJB in Controller (CDI) - Klasse füllen? Java Basics - Anfänger-Themen 3
L Zufälliges Objekt aus der ArraylList ohne java.util.Random Java Basics - Anfänger-Themen 56
N LocalTime einem Objekt zuweisen Java Basics - Anfänger-Themen 2
N Länge eines Arrays in einem Objekt testen Java Basics - Anfänger-Themen 51
M Wie kann ich ein Objekt erstellen, wenn sich der Klassenname in einer Variablen befindet? Java Basics - Anfänger-Themen 10
R Zugriff auf den Index eines Arrays, welches ein Objekt ist. Java Basics - Anfänger-Themen 4
tom.j85 Doppelte Foreach Schleife: Am Ende wird immer das Gleiche Objekt eingefügt Java Basics - Anfänger-Themen 4
J RSA Verschlüsselung Testen / byte[] in Objekt umwandeln Java Basics - Anfänger-Themen 1
M ArrayList - Objekt kopieren und ändern Java Basics - Anfänger-Themen 11
L Objekt an Methode übergeben Java Basics - Anfänger-Themen 4
S Spiel-Programmieren. Wenn ein Objekt den anderen berührt. Java Basics - Anfänger-Themen 6
J Y-Koordinate von GUI-Objekt bestimmen Java Basics - Anfänger-Themen 2
M Auf erstelltes Objekt einer anderen Klasse zugreifen. Java Basics - Anfänger-Themen 5
H Referenz Objekt aufrufen Java Basics - Anfänger-Themen 12
M Objekt mit eindeutiger ID löschen, das nächste Objekt hat dann diese ID Java Basics - Anfänger-Themen 5
N Mit Objekt der Superklasse auf Methode der Subklasse zugreifen Java Basics - Anfänger-Themen 6
E Objekt durch Benutzer über Konsole erzeugen - Java Java Basics - Anfänger-Themen 3
J Objekt bei Auswahl in jList ändern Java Basics - Anfänger-Themen 6
Kirby.exe Generische Objekt Instanz erstellen Java Basics - Anfänger-Themen 14
H Objekt aus einem Array löschen Java Basics - Anfänger-Themen 1
H Objekt im Array speichern Java Basics - Anfänger-Themen 2
H Objekt mit Methode erstellen Java Basics - Anfänger-Themen 6
H Objekt als Attribut speichern Java Basics - Anfänger-Themen 11
E Was kommt in ein Objekt und was in die Main Methode? Java Basics - Anfänger-Themen 8
R Objekt in Konstruktor ist nicht zulässig Java Basics - Anfänger-Themen 5
W OOP Objekt Methode Java Basics - Anfänger-Themen 9
A Objekt in Arrayliste Java Basics - Anfänger-Themen 2
B Mit methode Objekt aus anderer Klasse erstellen Java Basics - Anfänger-Themen 6
I Object-Oriented Programming, Objekt erzeugen Java Basics - Anfänger-Themen 1
M Objekt einer Klasse speichert die Veränderung nicht Java Basics - Anfänger-Themen 1
K Konstruktor für ein Objekt mit Zugriffsmethoden Java Basics - Anfänger-Themen 7
S Variablen Klassenvariable über Objekt aufrufen Java Basics - Anfänger-Themen 16
A Zufälliges Objekt basierend auf Wahrscheinlichkeiten bekommen. Java Basics - Anfänger-Themen 4
R Value von einem JSON-Objekt ausgeben Java Basics - Anfänger-Themen 4
P Objekt aus String-Array erzeugen Java Basics - Anfänger-Themen 104
N Bewegtes Objekt soll sich um eine Parallele bewegen Java Basics - Anfänger-Themen 0
S Objekt-Attribute "variabel" gestalten Java Basics - Anfänger-Themen 10
J Datenbankstruktur als Objekt anlegen Java Basics - Anfänger-Themen 4
L Objekt aus Textdatei in ArrayList speichern Java Basics - Anfänger-Themen 4
B Objekt an neue Stage übergeben? Java Basics - Anfänger-Themen 9
scratchy1 Wie deklariert man eine Methode, die ein Objekt zurückgeben soll? Java Basics - Anfänger-Themen 22
B Klassen Zugriff auf ein Objekt einer Klasse aus einer Methode heraus Java Basics - Anfänger-Themen 4
J Objekt erste freie Stelle zuweisen Java Basics - Anfänger-Themen 3
S Zugriff auf Objekt Java Basics - Anfänger-Themen 5
C Objekt soll ein Array sein. Java Basics - Anfänger-Themen 15
H Vererbung Static Scanner Objekt verwenden - von StdIn in einer importierten Klasse lesen Java Basics - Anfänger-Themen 10
CptK Datentypen Objekt lässt sich nicht zu arraylist hinzufügen Java Basics - Anfänger-Themen 2
R Vererbung werte von einem Objekt aus ein anderes übertragen Java Basics - Anfänger-Themen 7
Z Objekt Array führt zum NullPointerException Java Basics - Anfänger-Themen 2
L Objekt Typ zur Laufzeit ermitteln Java Basics - Anfänger-Themen 1
F Referenz an ein Objekt in einer anderen Klasse erstellen(Nullpointer exception) Java Basics - Anfänger-Themen 6
M Methode Objekt als Parameterübergabe Java Basics - Anfänger-Themen 6
G Objekt der selben Klasse wie selbst mit Aufrufen des Konstruktors erzeugen Java Basics - Anfänger-Themen 14
M Objekt mit Hashmap vergleichen Java Basics - Anfänger-Themen 22
C Neues Objekt mit Beziehung zu bereits bestehendem Objekt Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben