Rückgabe & Destroy?

flashray

Erfahrenes Mitglied
Hallo Freunde,

Wie kann man vorrübergehende Daten einer Methode löschen, also die Methodenrückgabe löschen.

Java:
public class DestroyExample {

	public static void main (String[] args){
		StringBuffer sb;
		sb = getData();
	}
	
	public static StringBuffer getData(){
		StringBuffer sb = new StringBuffer("jkl");	
		for (int i = 0 ; i < 21 ; i++)
			sb.append(sb);
		return sb;
		//sb = null; Wird aber nicht ausgeführt da es nach return kommt.
	}
}


Vg Erdal
 
Hi,
vielleicht kannst du nachdem du sb gebraucht hast, den Wert auf null setzten.
D.h. du verwendest es und danch dann sb = null;
MFg bigboombang
 
Genau das möchte ich auch. Das geht aber nicht, denn

StringBuffer getData() {
...
return sb;
sb = null; // Die letze Zeile wird nicht ausgeführt
}

Vg Erdal
 
Nein ich meinte das sb= null gesetzt wird aber erst dann wenn es gebraucht wurde.
d.H. deine main sieht so aus
Code:
StringBuffer sb;
sb = getData();
sb=null;
Aber ich weiß net ob es funktioniert war nur so ein Gedanke
MFG bigboombang
 
Ja in der main ist das kein Problem. Ich möchte aber das von der Getter-Methode löschen, das aus der main möchte ich weiter nutzen.

Vg Erdal
 
Hallo!

Das was du da machen moechtest ist unsinnig.
Java:
public class DestroyExample {

    public static void main (String[] args){
        StringBuffer sb;
        sb = getData();
    }
  

    public static StringBuffer getData(){
        StringBuffer sb = new StringBuffer("jkl"); 
        for (int i = 0 ; i < 21 ; i++)
            sb.append(sb);
        return sb;
        //sb = null; Wird aber nicht ausgeführt da es nach return kommt.
    }
}
Innerhalb der getData() methode erzeugst du eine StringBuffer Instanz deren Referenz du in der Methodenlokalen Variablen sb zwischenspeicherst. Anschliessend returnierst du sb (und damit die Referenz auf die StringBuilder Instanz). Die StringBuffer Instanz kann nach returnieren der getData Methode nicht mehr ueber den Methodenlokalen Namen sb erreicht werden, du brauchst sie also nicht mehr aufzuraeumen..

Um den von dir gewuenschten Effekt zu erreichen koenntest du das return in einem finally{...} Block setzen... wo bei ich das so nicht machen wuerde:
Code:
    public static void main(String[] args) {
        System.out.println(foo());
    }

    private static Object foo() {
        Object o = null;
        try {
            o = "Wo ist meine Exception?";
            throw new Exception();
        } finally {
            return o;
        }
    }

Gruss Tom
 
Danke!

Mit dem finally funktioniert es.

Java:
public class DestroyExample {

	public static void main(String[] args) {
		StringBuffer sb;
		sb = getSbTemp();
		System.out.println(sb);
	}

	public static StringBuffer getSbTemp() {
		StringBuffer sbTemporary = new StringBuffer("abc");
		for (int i = 0; i < 5; i++)
			sbTemporary.append(sbTemporary);
		try {
			return sbTemporary;	
		} finally {
			sbTemporary = null;
			System.out.println(sbTemporary);
		}	
	}
}

Vg Erdal
 
Hallo Romsl,

ob es Vorteil bringen wird weiß ich nocht nicht. Der Gedanke hierbei ist nicht benötigten Speicher wieder freizugeben, bzw. die Referenz zu einem Objekt einer Datei löschen welche viel Speicher benötigt.

Ich tüfftle grad an meinem Texteditor weiter. Neuerdings habe ich zwei weitere Klassen implementiert, wobei ich Speicher und Performance Probleme habe. Die Klassen heißen PrintTool und PrintPreview. Einmal möchte ich den Inhalt eines JTextAreas mehrseitig drucken können. Zweitens möchte ich eine Druckvorschau. Genau dies mache ich in diesen zwei Klassen, wobei der Speicher sehr schnell überläuft.

In PrintTool erzeuge ich eine Liste von BufferedImages, welche jeweils eine Din A4 Seite des Textes enthält.

Hole ich jetzt diese mit myprinttool.getPreviewImages() zu der Klasse PrintPreview um diese weiterzuverarbeiten und anzuzeigen, habe ich die BufferedImages doppelt, deswegen soll die Mehtode getPreviewImages() nach der Rückgabe diese Löschen. So habe ich nur noch eine Liste an Bildern welche der Klasse PrintPreview zur Verfügung stehen.

Statt die Bilder von allen Seiten auf einmal zu holen könnte ich diese direkt vor dem Anzeigen erzeugen, dann stimmt aber die Performance nicht mehr. Es dauert eine Weile, ein Paar Sekunden, wenn ich in meiner Druckvorschau blättere.


Vg Erdal
 
Zurück