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.
ich habe folgendes Problem:
Ich habe ein Objekt "Auto", welches die Eigenschaft "Zustand" hat und die Klassenmethode "baueUnfall", welches den Zustand verringert. Ab einem bestimmten Wert soll die Methode "baueUnfall" eine Klassenethode "verschrotteAuto" aufrufen, welche die Instanz des Objekts Auto löscht. Es existieren mehrere Referenzen auf das Objekt Auto.
Anders ausgedrückt: Ich brauche im Prinzip so etwas wie "this.free".
Wie kann man so etwas am besten umsetzen?
falls ein Objekt nicht die Referenzen kennt die auf sie zeigen, hat es keine Chance sie auf null zu setzen oder ähnliches,
es gibt auch nix um ein Objekt zu zerstören,
du könntest dir höchstens selber was ähnliches basteln,
etwa einen boolesches Klassenattribut auf true setzten (von außen abfragbar per Operation istZerstört())
und spasseshalber nach der Zerstörung bei allen Operationen am Anfang eine Exception schmeißen oder ähnlich böses
die Referenzen gehen davon aber nicht wirklich kaputt,
du musst schon darauf vertrauen dass die Referenzhalter selbständig bemerken wann ein Objekt nicht mehr benötigt wird
nö, alle anderen noch existierenden Referenzen können ganz normal mit der Instanz weiterarbeiten...
das mit dem Flag wäre ok, aber Exceptions? andere Referenzbesiter wissen doch gar nicht, wann das ding verschrottet wird, das führt dann dazu, dass man VOR JEDER VERWENDUNG istZerstört aufrufen muss (auch nicht gerade gut...)
An die Lösung mit dem Flag habe ich auch schon gedacht.. das Problem ist nur, dass die Referenzen auf Auto in Arrays gespeichert sind und es ziemlich umständlich ist, die Arrays umzusortieren, wenn ein Auto Objekt gelöscht wird.
Anscheinend gibt es hierzu keine Patentlösung in Java, aber ich werde trotzdem versuchen mit Flags was vergleichbares hinzubiegen.
Das Observer-Pattern wäre hier doch angebracht. Wenn ein Auto verschrottet wird, informiert es alle "AutoListener". Wer immer wissen muss, wenn ein Auto vernichtet wird, registriert ein "AutoListener" bei dem entsprechenden Auto.
Code:
public interface AutoListener{
public void kadabuUUum( Auto auto );
}
Code:
public class Auto{
private List listeners = new ArrayList();
// wer was wissen will, registriert sich hier
public void addAutoListener( AutoListener listener ){
listeners.add( listener );
}
// wer kein Interesse mehr hat, deregistriert sich hier
public void removeAutoListener...
// wenn kaputt, werden alle Interessierten benachrichtigt, und
// können das Auto gegebenenfalls aus ihren Listen löschen.
private void verschrottet(){
AutoListener[] listeners = (AutoListener[])this.listeners.toArray( new AutoListener[ this.listeners.size() ] );
for( int i = 0; i < listeners.length; i++ )
listener.kadabuUUum( this );
}
}