Eindeutiger Name von Objekten

Wolfsbein

Erfahrenes Mitglied
Hallo

ich bins schon wieder: Meine Objekte der Klasse A haben alle einen Namen (String). Allerdings darf kein Name zweimal auftauchen. Das überprüfe ich mit einer statischen Liste, die die Namen enthält. Wenn ich z.B.
Code:
A a1 = new A("a1");
A a2 = new A("a1");
schreibe, wird der doppelte Name erkannt. Nur existiert deswegen trotzdem a2 mit null als Namen. Wie kann ich verhindern, dass a2 überhaupt angelegt wird? Der Konstruktor hat ja keinen Rückgabetyp, sonst könnte ich einfach ein return false o.Ä. machen.
 
Hallo!

Kannst du diesen Teil nicht anders implementieren?
Wie wärs beispielsweise mit einer Factory Klasse die eine Methode Namens createA(String name) besitzt in der du dann zuerst in deiner Liste (bzw. deinem Set (HashSet)) nachschaust und wenn dort noch nichts vorhanden ist dann legst du eine neue Instanz an und gibst die Referenz darauf zurück. Wenn schon ein Eintrag mit dem gleichen Namen vorhanden ist gibst du null zurück.

Gruß Tom
 
Normalerweise würde man das auch so machen, oder gleich mit einer Assoziationsklasse. Nur ist das leider eine Uniaufgabenstellung ;). Also umständlich.
 
Schreibe doch eine Methode, welche überprüft ob der Name eines Objektes==Null ist und teste nach jeder Initialiserung ob dies der fall ist, wenn ja Setze das Objekt ==null und stosse manuell eine GC an. Ist zwar dirty und kann mit der Zeit ziemlich performance fressen (wg. der GC) aber tut so.

Somit umgehst du das Factory-Pattern (was ja eigentlich dafür da ist, und so genutzt werden soll) und eliminierst null-name einträge von den objekten.

Grüsse

Torsten
 
torsch2711 hat gesagt.:
Schreibe doch eine Methode, welche überprüft ob der Name eines Objektes==Null ist und teste nach jeder Initialiserung ob dies der fall ist, wenn ja Setze das Objekt ==null ...
Das geht aber nur außerhalb, oder?
Weil ein
Code:
if (!setName(name)) {
    this = null;
}
im Konstruktor geht nicht.
 
Man kann die Referenz des this Zeigers nicht verändern...

Normalerweise würde man das auch so machen, oder gleich mit einer Assoziationsklasse. Nur ist das leider eine Uniaufgabenstellung . Also umständlich.

Hi,
das habe ich jetzt nicht so richtig verstanden, was ist an Toms Methode groß
umständlich?

Code:
class A{

        public A(){
                ...
        }
        static public A createA(String s){ 

                A tmp = new A();     
                if(!tmp.setName(s))  
                        return null;         
                else
                        return tmp;          
        }

        public boolean setName(String name){
                ...
        }

        public static void main(String args[])
        {

                A a1 = A.createA("a1");
                A a2 = A.createA("a1");
                if(a2 != null)       
                        ...                  
        }
}

Allerdings kenne ich mich in Java nur unzureichend aus und weiß nicht ob die
Methode durch den gc sicher gemacht wird?
In C++ wäre das ein ptoentielles Speicherleak...

Gruß

RedWing
 
Hallo!

Werf einfach ne Exception wenns nicht passt:
Code:
package de.tutorials.test;

import java.util.ArrayList;
import java.util.List;

public class Main {

	static List names = new ArrayList();

	public static void main(String[] args) {
		new Main().doIt();
	}

	private void doIt() {
		A a = null;
		A a1 = null;
		try {
			a = new A("A1");
		} catch (Exception e) {
			e.printStackTrace();
		}
		try {
			a1 = new A("A1");
		} catch (Exception e1) {
			e1.printStackTrace();
		}

		System.out.println(a);
		System.out.println(a1);
	}

	class A {
		String name;

		public A(String name) throws Exception {
			this.name = name;
			if (!names.contains(name)) {
				names.add(name);
			} else {
				throw new Exception("Element mit namen: " + name
						+ " bereits vorhanden...");
			}
		}

		public String toString() {
			return this.name;
		}
	}
}

Gruß Tom
 
Exceptions dürfen wir nicht hernehmen, weil wir sie noch nicht kennen ;). Bei meiner letzten Lösung wurde mir das angekreidet :(. Und wir dürfen auch nur zwei Klassen haben. Aber es läuft jetzt. Und ich lösche die Objekte gar nicht, sondern gebe nur eine Fehlermeldung aus. Das reicht für die Uni.
 
Zurück