# Objekt löschen



## bas79 (3. April 2007)

iHola!

Hab mich jetzt im Netz dumm und dusselig gesucht für mein Problem.
Folgendes: ich habe Klassen erzeugt (z.B. Kunde) und diese Klassen enthalten mehrere Objekte (angelegte Kunden halt), welche einige Eigenschaften besitzen. Der Nutzer des Progs soll nach Progstart Kunden anlegen (das hab ich - klappt supi) und auch wieder anhand einer Eigenschaft (Kundennummer) löschen. Nur wie? Kunden erstellen -> no prob, aber löschen? Also Kunden suchen lassen und alle Eigenschaften anhand gewählter Kriterien anzeigen lassen hab ich auch schon hinbekommen (Suchefunktionen).

Sorry wegen dummer Fragen, hab gerade angefangen...

LG, Bas.


----------



## Gainwar (3. April 2007)

Hiho!

Objekte können nicht "explitzit" gelöscht werden. Sobald alle Referenzen auf ein Objekt entfernt sind ist dieses Objekt für den Garbage-Collector frei gegeben. Der Garbage-Collector übernimmt dann das entgültige entfernen.

Referenzen kannst du einfach mit der Zuweisung von *null* löschen.


```
Kunde myKunde = new Kunde();
myKunde = null;
```

Solltest du dieses Kunden-Objekt nun auch noch in einer *java.util.List* Implementierung speichern o.ä., dann muss es hieraus auch entfernt werden, denn sonst existiert ja noch immer eine Referenz.

Gruß Manuel


----------



## matdacat (3. April 2007)

Du solltest "löschen" genauer definieren. So wie's scheint, speicherst Du Deine Daten nicht persistent, beispielsweise in einer Datenbank.

Vermutlich verwaltest Du Deine Kunden in einem Vektor o.ä. Somit musst Du nur diesen Vektor durchlaufen und bei übereinstimmender ID diesen Eintrag mittels removeElement entfernen. Vielleicht ist in Deinem Fall auch eine HashMap interessant, mit Hilfe derer Du direkt mittels ID auf das Kundenobjekt zugreifen kannst.


----------



## bas79 (3. April 2007)

Hey, 

hast recht matdacat, schreibe die Daten in einen Vektor - erstmal noch ohne Datenbank.
Hier mal ein Auszug wie die Daten angelegt werden und wie ich vorhatte sie zu löschen:



```
import java.io.*;
import java.util.*;
import java.util.Vector;
import java.lang.*;

// Verwaltung von Objekten mit dynamischem Container
// Suche nach einem Kundennamen

public class KundenContainer {
    
    static private int kdanzGesamt = 0;
    static final private int FELDGROESSE = 3;  // nur für Test
    static private int maxKunden = FELDGROESSE;  // nur für Test
    static private Kunde[] kunden = new Kunde[maxKunden];
    
    
    void einfügenKunde(Kunde k) {
        kdanzGesamt++;
        
        if (kdanzGesamt == maxKunden)	// Array vergrößern
        {
            maxKunden = maxKunden + FELDGROESSE;
            Kunde[] kundenMehr = new Kunde [maxKunden];
            // in größeres Array kopieren
            for (int i = 0; i<kunden.length; i++)
                kundenMehr[i] = kunden[i];
            // altes Array ersetzen
            kunden = kundenMehr;
        }
        kunden[kdanzGesamt] = k;
    }
    
    void loescheKunde(int loeschnr, int dle) {
	while (dle<kdanzGesamt) {
		dle++;
		if (kunden[dle].getNummer() == (loeschnr)) 
			{
				?
			}
	}
    }
```

Egal, wie ich removeElement einsetze, er sagt mir immer, dass er das "Symbol" nicht finden kann...

LG, Bas.


----------



## th0r (3. April 2007)

bas79 hat gesagt.:


> Egal, wie ich removeElement einsetze, er sagt mir immer, dass er das "Symbol" nicht finden kann...



Ich kann mich zwar irren, aber liegt es nicht vielmehr daran, dass "Kunde" ein Array ist und "removeElement" ein Vectorbefehl ist?


----------



## MaLb (3. April 2007)

Ein Array hat keine Remove Optionen. Daten aus dem Array herauszubekommen ist einiges schwieriger... dazu ist ein Array aber auch nicht gedacht. Nutze halt einen Vector (java.util) oder einen sonstigen dynamischen Datentyp... damit geht ganz leicht.


----------



## matdacat (3. April 2007)

bas79 hat gesagt.:


> hast recht matdacat, schreibe die Daten in einen Vektor



Hallo Bas,
nein, Du verwendest keinen Vektor, sondern ein Array. Ist das eine Schulaufgabe und Du mußt ein Array verwenden? Wie schon erwähnt wurde, sollte man eine dynamische Datenstruktur wie einen Vektor nutzen, wenn man Datensätze hinzufügen und wieder löschen möchte.

Solltest Du wirklich ein Array benutzen müssen, dann führ einen Zähler mit, wieviele Elemente Dein Array gerade beinhaltet und verschieb alle folgenden Elemente um eine Position, wenn Du mittendrin ein Element entfernst.


----------



## bas79 (3. April 2007)

Immer diese Anfänger! Können nicht mal nen Vektor von nen Array unterscheiden...  

Nunja, hab das jetzt einfach mal anders gelöst. Wenn das Objekt im Array gelöscht werden soll, werden einfach alle Eigenschaften auf "0" gesetzt. Wenn anschließend ein neues Objekt erstellt wird, soll er erst schauen, ob es ein Objekt mit allen Eigenschaften = "0" gibt. Ist dies der Fall soll er einfach da die Attribute ersetzen. Wenn nicht, so halt wie immer. Habs ausprobiert - es funktioniert. Bestimmt nicht die Masterlösung, aber für mich reichts. Dank an euch.

LG, Bas.


----------

