Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Hallo Leute,
ich steh mit der Java Programmierung noch relativ weit am Anfang und ich brauche eine Idee wie ich folgendes Problem lösen kann.
Es geht um das freigeben bzw löschen von Objekten, in Java ist es ja so das der garbage collector erst ein Objekt "entsorgt" wenn alle Referenzen auf dieses Objekt "geNullt" worden sind. Ich möchte aber folgende Situation schaffen.
Ich habe eine Liste in der alle Objekte enthalten sind bzw Referenziert sind. Auf die Objekte in der Liste zeigen aber auch noch andere Referenzen die aber nur zweitrangig sind.
jetzt kommst -> wenn das Objekt in der Liste gelöscht wird (list.remove(...)) sollen alle anderen Referenzen die auf das Objekt zeigten, nun auf Null zeigen. bzw wiedergeben. Normalerweise würden die anderen Referenzen das Objekt ja am Leben erhalten was aber von mir nicht gewollt ist. Wie kann ich das lösen ?
Ich habe gehört man kann so etwas mit WeakReferenzen machen. nur leider habe ich es damit noch nicht hin bekommen. Ist so was denn damit wirklich möglich?
ich hoffe ihr habt mein Problem soweit verstanden und ihr könnt mir hier vielleicht einen Ansatz geben.
das klingt für mich danach als sollen zwei Objekte (deine Liste) und dein anderer Referenz Punkt miteinander interagieren ohne sich gegenseitig zu kennen. Ich persönlich weiß gerade nicht wie das klappen könnte.
Wenn du wirklich noch am Anfang von Java stehst, ist das aus meiner Sicht ein Struktur Problem =/
kannst du das ganze nicht vlt auf einem andern Weg lösen?
Wenn es noch andere Referenzen gibt, die auf die Arrays zeigen, bleiben zwar die Arrays im RAM, aber ihr Inhalt nicht.
Allerdings vermute ich stark, dass du sowas überhaupt nicht benötigst.
Genullt werden müssen nur Objekt an Primzahl-Arrayindexen (0 und 1 sind für diesen Aspekt Primzahlen), alles andere erledigt der nebenläufige Garbage-Collector
Eine Weak-Reference hindert den Garbage-Collector nicht daran, das Objekt zu entsorgen. Wenn also alle Strong-References weg sind, kommt das Objekt auf den Müll auch wenn noch Weak-References existieren. Das ganze hat aber ein undeterministisches Zeitverhalten, weil du nie genau wissen kannst, wann der GC rennt. Selbst wenn du ihn direkt aufrufst, ist das keine Garantie dafür, dass er tätig wird, weil der Aufruf nur eine Art Wunsch darstellt, er möge doch jetzt mal machen. Wann die Diva wirklich macht, entscheidet sie selber. Deswegen das "sleep" in dem Beispiel.
Genullt werden müssen nur Objekt an Primzahl-Arrayindexen (0 und 1 sind für diesen Aspekt Primzahlen), alles andere erledigt der nebenläufige Garbage-Collector
mal von abgesehen das 0 und 1 im mathematischen sinn keine primzahlen sind und der rest des posts auch völliger müll habe ich dich mal eben als troll mit der bitte um sperrung gemeldet ... schönen tag noch
Das mit dem Array wäre eine gute Idee worauf man aufbauen könnte.
Aber vielleicht habe ich wirklich nur ein Struktur Problem ? Wie würdet ihr das Lösen ?
Also ihr habt mehrere Objekte diese Objekte sind in einer Zentralen "Datenbank"(in meinem Fall eine Liste) aufgeführt um z.b. suchläufe durchzuführen. Die Objekte müssen sich untereinander kennen. zB.
Objekt A kennt Objekt B
Objekt B kennt Objekt A und C
Objekt C kennt Objekt B
Jetzt Möchte ihr Objekt A löschen. (List.remove(0))
In Objekt B ist aber immer noch die Referenz auf A gespeichert. Wodurch A zwar aus der Liste raus ist aber für B immer noch existiert.
Was kann man jetzt tun ?
Die Referenz aus B händisch löschen ? Wäre für mich keine sehr elegante Lösung, außer dem ist das Beispiel hier stark vereinfacht und würde im richtigen Programm viel mehr Aufwand bedeuten.
Oder gibt es noch andere lösungsmöglichkeiten um das Problem von vorneherein zu umgehen ?
Weakreferenzen wären hier vielleicht wirklich die Lösung aber dieses eigenartige zeitverhalten könnt zum Problem werden :|
vielen Dank schon mal wieder fürs durchlesen XD
Ich freue mich auf eure Antworten.
Wieso hat Objekt A eine Referenz auf B? Entweder A braucht B, in dem Fall darfst du die Referenz natürlich nicht löschen auch wenn du B aus der Liste entfernst, oder aber A benötigt B nicht, in dem Fall sollte A von vornherein gar keine Referenz auf B enthalten.
Vielleicht wäre es besser A hat eine Referenz auf die Liste.
Wieso hat Objekt A eine Referenz auf B? Entweder A braucht B, in dem Fall darfst du die Referenz natürlich nicht löschen auch wenn du B aus der Liste entfernst, oder aber A benötigt B nicht, in dem Fall sollte A von vornherein gar keine Referenz auf B enthalten.
Mehr ist dazu eiogentlich nicht zu sagen. Das trifft die Sache zu 100% auf den Punkt. Alles andere ist Blödsinn und kann kein vernünftiges Programmdesign sein.
Zum Thema Weak-Referenzen: Wer die benutzt sollte GANZ GENAU wissen was er da tut. Denn schließlich wird einem Object einfach mal eine Referenz entzogen auf die das Object selber noch zeigt. Greife ich auch aus was für einem Grund dann noch einmal auf diese nicht mehr existente Referenz zu, dann knallt es ganz gehörig.
Wenn man so etwas wie der TO haben möchte wirklich braucht (Und das ist verdammt selten der Fall und im Falle des TO sicherlich nicht nötig) dann sollte man z.B. mit Notifications arbeiten. Dann kann das Object, welches gelöscht wird eine Notification abschicken "Hey ich bin weg" und alles anderen Objecte, die auf dieses Object referenziert haben horchen auf diese Notification und setzen dann schön brav ihre Referenz auch auf null.
Das mit der Variable "isAlive" gefällt mir sehr gut da dies mir sehr einfach und zuverlässig erscheint.
Aber auch die Notifications lösung ist einen genaueren Blick wert.
Ich bedanke mich bei euch für die Vielen Ansätze die ihr mir gegeben habt.
Jedoch möchte ich noch klarstellen das solche Konstellationen vielleicht selten sind, aber eine solche in meinem Projekt zwingend erforderlich ist.
Ich habe hier keinerlei Details aufgezählt die irgendwelche Rückschlüsse erlauben was ich benötige und was nicht, oder gar es gestatten dinge für "Blödsinn" zu erklären.