# Neue Objekte zur Laufzeit erzeugen



## Ay Caramba (13. Apr 2008)

Hallo,

ich lerne gerade Java und bin nun bei einem Problem angelangt wo ich nicht weiter komme.
Ich würde gerne zur Laufzeit, wenn das Programm arbeitet, je nach Situation zusätzliche Objekte einer Klasse erstellen wollen


```
public class Hallo{

private String str=name;

public void doStuff(){
...
}

public void setName(String input){
name=input}

public String getName(){
return name;
}

}



public class Start{
public static void main (String[] args){

Hallo h=new Hallo();

...
h.setName("Test");
mache hier weiter...
if(h.getName().equals("Test");
MACHE hier neue Objekte.
....
und jetzt kommt mein Programm durch eine Eingabe oder Abfrage drauf, dass noch ein weiteres Objekt der Klasse Hallo
erzeugt werden soll. Ich habe schon 1x Hallo Objekt, nämlich "h", jetzt möchte ich aber weitere Objekte erzeugen. 

}
}
```

Wie würde ich denn nun diese weiteren Objekte, wo ich weder den Namen, noch die Anzahl kenne erzeugen?


----------



## Guest (13. Apr 2008)

Du kannst eine Collection verweden (eine Liste von Objekten) oder ein Map mit Namen als Schlüssel und Hallo-Objekt als Wert.
	
	
	
	





```
List<Hallo> list = new ArrayList<Hallo>(); // Liste für Hallo-Objekte
oder
Map<String, Hallo> map = new HashMap<String, Hallo>(); // Map mit Name-Wert Paaren
```


----------



## Ay Caramba (14. Apr 2008)

wäre ein simples funktionierendes Beispiel möglich?


----------



## Guest (14. Apr 2008)

Klar, kein Problem.
	
	
	
	





```
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

public class ObjektListe
{
   static class Hallo
   {
      private String name;

      public Hallo(String name)
      {
         assert name != null: "Name darf nicht null sein!";
         this.name = name;
      }

      public String getName()
      {
         return name;
      }

      @Override
      public int hashCode()
      {
         return name.hashCode();
      }
      
      @Override
      public boolean equals(Object obj)
      {
         if( obj == null || !(obj instanceof Hallo))
         {
            return false;
         }
         return name.equals(((Hallo)obj).name); 
      }
   }

   public static void main(String[] args)
   {
      List<Hallo> nameList = new ArrayList<Hallo>();
      
      try
      {
         BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
         for(;;) // eine Endlosschleife
         {
            System.out.print("Namen Eingeben (leere Eingabe für Ende): ");
            // Zeile einlesen
            String eingabe = in.readLine();
            
            // Nichts eingegeben, dann raus aus der Schleife
            if( eingabe.trim().length() == 0 )
            {
               break;
            }

            // Eine Instanz von Hello erzeugen 
            Hallo hallo = new Hallo(eingabe);
            
            // wenn ein Hallo mit gleichem Namen bereits existiert
            if( nameList.contains(hallo) )
            {
               // Eingabefehler melden
               System.out.println(String.format("Der Name '%s' wurde bereits eingegeben.", hallo.getName()));
               // und zum Schleifenanfang springen
               continue; 
            }
            
            // Das neue Hallo-Objekt in die Liste eintragen
            nameList.add(hallo);
         }
      }
      catch(IOException e)
      {
         e.printStackTrace();
      }
      
      System.out.println("\nFolgende Namen wurden eingegeben\n");
      for(Hallo hallo : nameList)
      {
         System.out.println(hallo.getName());
      }
   }
}
```


----------



## Guest (14. Apr 2008)

Ersetze noch
	
	
	
	





```
Hallo hallo = new Hallo(eingabe);
```
durch
	
	
	
	





```
Hallo hallo = new Hallo(eingabe.trim());
```
Es schneidet überflüssige Leerzeichen ab.


----------



## Ay Caramba (15. Apr 2008)

Danke dir für die Antwort.

Hätte mir eigentlich selber einfallen müssen, dass ich statt einem fixen Objektnamen einfach eine Variabel übergebe und diese einen String enthält. Wenn ich keine Benutzereingabe will, kann ich auch ohne Probleme einen String+array_ übergeben. i ist halt der counter der sich immer für jedes Objekt ändert.



		Code:In die Zwischenablage kopieren


for(Hallo hallo : nameList)
      {
         System.out.println(hallo.getName());
      }


Könntest du bitte vielleicht diese for Schleife kurz erklären? Ich habe bis jetzt nur mit for(initialisierung;Bedingung;Fortschaltung) gearbeitet und keine deine Syntax überhaupt nicht. Wissen=0; Ich lese da heraus:Gebe alle Objekte hallo vom Typ Hallo die sich in der Liste nameList befinden.




		Code:In die Zwischenablage kopieren


  @Override
      public int hashCode()
      {
         return name.hashCode();
      }


mit dem kann ich leider garnichts anfangen._


----------

