# Programm zum verwalten von Objekten



## Unkownsyntax (2. Jan 2009)

Bin gerade am Programmieren eines Verwaltungsprogs.... soll das können:

Es sollen beliebig viele Häuser verwaltet werden können. Zur Laufzeit sollen Häuser 
dazugenommen oder wieder abgegeben werden können. Es soll auch die Moeglichkeit 
bestehen, dass nach Häusern anhand der Adresse gesucht werden kann. Das heißt man braucht 
Methoden zum Hinzufügen, Entfernen und Suchen von Häusern. 

 Von jedem Haus möchten Sie wissen, wo es sich befindet (eindeutige Adresse). Jedes Haus hat 
eine fixe Anzahl von Stockwerken und in jedem Stockwerk eine fixe Anzahl von Wohnungen. 

 Man soll die Bewohner (Personen) jeder Wohnung verwalten können damit jederzeit Personen 
in eine Wohnung ein- oder aus einer Wohnung ausziehen können. Daher braucht man auch hier 
Methoden zum Hinzufügen und Entfernen von Personen. 

Von den Personen will man den Namen und das Alter wissen. Diese beiden Angaben sollen 
eine Person innerhalb einer Wohnung eindeutig identifizieren. 

Schreiben Sie ein Testprogramm, das mindestens 2 Häuser, die Sie verwalten, erzeugt. Diese 
sollen unterschiedlich viele (mindestens 2) Stockwerke besitzen. Bevölkern Sie die erzeugten 
Wohnungen mit unterschiedlich vielen Personen (es dürfen auch manche, max. die Hälfte der 
Wohnungen leer bleiben). 

Sehen Sie Methoden vor, die es Ihnen erlauben, die Personendaten der Bewohner auf dem 
Bildschirm auszugeben. Im Testprogramm soll ein Aufruf der Form 
myHouseAdmin.writeResidents(); genügen. Dadurch soll das Hausverwaltungs-Objekt alle 
seine Haus-Objekte anweisen, ihre Bewohner auszugeben. Die einzelnen Haus-Objekte leiten 
das ihrerseits an ihre Wohnungs-Objekte weiter. Diese können dann endlich wirklich auf die 
Personen zugreifen. 

Als Klassen bieten sich Hausverwaltung, Haus, Wohnung und Person an. Um untergeordnete 
Objekte zu verwalten, sollen Sie lineare Listen verwenden. Beachten Sie auch die Datenkapselung 
(„set“ und „get“ -Methoden)! 
Gestalten Sie die Ausgabe des Hausverwaltungprogrammes so, dass diese nach Häusern, 
Stockwerken, Wohnungen gegliedert ist und für jede Wohnung die Bewohner dazu ausgibt.  

Hab jetzt mal den code für die ganzen classen geschrieben und so ca:




```
public class Hausverwaltung {

    public void run() {
        int a = 0;
        do {
            IO.writeLn("0 Für Ende!");
            IO.writeLn("1 Ein Haus hinzufügen!");
            IO.writeLn("2 Ein Haus entfernen! ");
            IO.writeLn("3 Ein Haus suchen!");

            a = IO.readInt();

            switch (a) {
                case 1:
                    IO.write("Name des Hauses:  ");
                    String addHouse = IO.readWord();
                    this.addhouse(addHouse);
                    break;
                case 2:
                    IO.write("Name des Hauses:  ");
                    String delHouse = IO.readWord();
                    this.delHouse(delHouse);
                    break;
                case 3:
                    IO.writeLn("Straße des suchenden Hauses: ");
                    String suchen = IO.readWord();
                    searchHouse(suchen);
                    break;
            }
        } while (a != 0);
    }

    public void searchHouse(String search) {
        
        
    }

    public void addhouse(String House) {
      Haus myhouse = new Haus();  
      IO.writeLn("Adresse: ");
      String a = IO.readWord();
      Haus.setAdresse(a);  // gibt mir hier nen fehler aus das er die methode nicht kennt!
     
    }

    public void delHouse(String House) {
        
        
    }
}

public class Haus {

    int AnzahlWohnungen;
    int Stockwerke;
    String Adresse = "";

   void setAdresse(String Adresse) {

        this.Adresse = Adresse;
    }

    String getAdresse() {
        return Adresse;
    }

    void setAnzahlWohnungen(int Anzahl) {
        if (Anzahl < 0) {
            Anzahl = 0;
        }
        this.AnzahlWohnungen = Anzahl;
    }

    int getAnzahlWohnungen() {
        return AnzahlWohnungen;
    }

    void setStockwerke(int Anzahl) {
        if (Anzahl < 0) {
            Anzahl = 0;
        }
        this.Stockwerke = Anzahl;
    }

    int getStockwerke() {
        return Stockwerke;
    }
}


public class Wohnung {

    int Person;

    int getPerson() {
        return Person;
    }

    void setPerson(int Anzahl) {
        if (Anzahl < 0) {
            Anzahl = 0;
        }
        this.Person = Anzahl;

    }
}


public class Person {

    String Name = "";
    int age;

    String getName() {
        return Name;
    }

    void setName(String name) {

        this.Name = name;
    }

    void setAlter(int Anzahl) {
        if (Anzahl < 0) {
            Anzahl = 0;
        }
        this.age = Anzahl;
    }

    int getAlter() {
        return age;
    }
}

public class Main {

    public static void main(String[] args) {
     Hausverwaltung hausverwaltung = new Hausverwaltung();
     hausverwaltung.run();
     
    }

}
```

Hab irgendwie das problem dass ich in der klasse hausverwaltung keine set und get funktionen von anderen klassen aufrufen kann ... wieso ist das so?

Was haltet ihr bis jetzt von dem programm von den klassen so ok? hat wer verbesserungsvorschläge?

Bei den add search und del house bin ich mir nicht ganz sicher wie ich das am besten mache..


----------



## 0x7F800000 (2. Jan 2009)

> Hab irgendwie das problem dass ich in der klasse hausverwaltung keine set und get funktionen von anderen klassen aufrufen kann ... wieso ist das so?


weil deine getter und setter nicht statisch sind (was auch richtig so ist). Du kannst die nicht an der Klasse, sondern nur an den Instanzen der Klasse aufrufen, also nicht

```
Haus.method()
```
 sondern 
	
	
	
	





```
Haus h=new Haus(...); h.method()
```
.
[edit] korrigiert, besten Dank an _mogel_[/edit]


> Was haltet ihr bis jetzt von dem programm von den klassen so ok? hat wer verbesserungsvorschläge?


Nunja, bisher ist da ja nicht viel drin.
Vor allem, was nicht drin ist, sind die ganzen sichtbarkeits-schlüsselwörter *public private protected*, eigentlich schade, dass der compiler deswegen nicht meckert, die sollte man eigentlich nie einfach so weglassen. mach alles private was nur irgendwie möglich ist.


----------



## Gast2 (2. Jan 2009)

Andrey hat gesagt.:
			
		

> ```
> Haus h=new Haus(...); haus.method()
> ```




```
h.method();
```


----------



## Unkownsyntax (3. Jan 2009)

noch ne frage wenn ich jetzt bei der methode addhouse haus h = new haus (); schreib wird dann nicht jedes mal wenn ich ein haus anlege das andere überschrieben ?


----------



## 0x7F800000 (3. Jan 2009)

ne, es gibt da nichts zu überschreiben: wenn du die methode verlässt, wird die lokale, nirgends sonst referenzierte variable h sowieso vom garbage-collector eingesammelt.


----------



## Unkownsyntax (3. Jan 2009)

heißt dass das haus was ich erstelle mit der methode wird nach dem verlassen des programmes glöscht? sollte ja nicht sein .... oder täusch ich mich da jetzt. soll ich nur in der main zwei häuser erstellen und dann einfach eins hinzufügen können?


----------



## 0x7F800000 (3. Jan 2009)

Nach dem beenden des Programms wird sowieso der komplette RAM freigegeben (du musst deinen Rechner ja auch nicht nach einmaliger benutzung wegwerfen, und mit frischen RAM-Plättchen muss man den PC vor dem Start auch nicht füttern, diese angenehme Tatsache ist dir womöglich auch schon aufgefallen  )
Dieses objekt "myhouse" aus deiner "korrigierten" methode:

```
public void addhouse(String House) {
      Haus myhouse = new Haus(); 
      IO.writeLn("Adresse: ");
      String a = IO.readWord();
      myhouse.setAdresse(a);
}
```
wird aber sofort nach dem verlassen der methode wieder eingesammelt und gelöscht, weil es ja nirgendwo mehr referenziert wird. Was nicht mehr referenziert wird, und nur als unerreichbares unauslesbares unbeschreibbares schwarzes Loch im Speicher rumliegt, wird in JVM vom Garbage Collector eingesammelt. Ist auch gut so, sonst würde ja ein memory-leak entstehen, und das programm nach einiger zeit abstürzen (ein ziemliches Problem, wenn man zB mit C++ proggt, da muss man immer aufpassen, dass man selbst alles sauber aufräumt).

Wenn du das Objekt "myhouse" nicht verlieren willst, muss du das ja irgendwo referenzierbar abspeichern, etwa in irgendeiner collection, die member-variable in deiner Häuserverwaltungsklasse ist:

```
public class HaeuserVerwaltung{
   private Collection<Haus> haeuser;
   public HaeuserVerwaltung(){
       haeuser=new WasAuchImmerFüeEineCollection<Haus>();
   }

   public void hausEinlesen(){
      Haus x=new Haus();
      ....
      x.setzeName("shicebude");
      haeuser.add(x); // jetzt ist es in der collection drin, und wird erstmal nicht vom GC verschrottet
   }
}
```

und überhaupt... einige dich mit deinem alter ego auf irgend*EINE* sprache, dieser ganzer "haus-house" salat ist doch unerträglich :bloed:


----------



## Unkownsyntax (3. Jan 2009)

frage brauch ich beim 2. code nicht einen return befehl also return haeuser; ?


----------



## 0x7F800000 (3. Jan 2009)

1) nein, weil vor der methode eh "void" steht
2) wozu soll das gut sein?


----------



## Unkownsyntax (3. Jan 2009)

ne ich meine im oberen teil bei public HauserVerwaltung () da steht ja kein void


----------



## 0x7F800000 (3. Jan 2009)

das ist ja auch ein Konstruktor, keine Methode, da darf man sowieso nichts zurueckgeben.


----------



## Unkownsyntax (3. Jan 2009)

hab jetzt gerade herumgesurft und da ich es sowieso mit linearen listen machen muss wärs doch am besten wenn ich es in der methode addhouse mit ner array liste mache oder? weil da bleibt ja dann das objekt vorhanden oder?

also ArrayList h = new ArrayList(); oder?


----------



## Landei (3. Jan 2009)

So kann man es machen, aber das ist nicht gut. Üblicherweise schreibt man

```
List<Haus> hausListe = new ArrayList<Haus>();
```
-> bei Collections immer den Typ (hier: Haus) mit angeben
-> Immer das allgemeine Interface (hier: List) als Typ der Variablen angeben, und dann mit der konkreten Klasse (hier: ArrayList) inititalisieren


----------



## Unkownsyntax (5. Jan 2009)

Ok da ich ja aber listen für die häuser und dann untergeordnete listen für personen wohnungen usw brauche wie wär es am besten zu machen? mit linearen listen eine liste immer für ein haus mit den wohnungen usw. oder eher eine liste wo die häuser drinnen sind dann ein für wohnungen usw. oder wer ne andere idee?


----------



## Unkownsyntax (5. Jan 2009)

Landei hat gesagt.:
			
		

> So kann man es machen, aber das ist nicht gut. Üblicherweise schreibt man
> 
> ```
> List<Haus> hausListe = new ArrayList<Haus>();
> ...



wenn ich es so schreibe kann ich mit hausliste.add(string); nicht hinzfügen da gibt er mir einen fehler aus....

was mich noch beschäftigt ist das problem und zwar wenn ich jetzt bei addhaus hausliste = new hausliste schreib und zweimal ein haus mit einen anderen string hinzufüge dann gibt es doch zwei listen mit den gleichen namen aber halt einen anderen string im ersten array oder? und wie könnte ich das am besten machen mit den personen wohnungen usw ... gehört ja immer zu einen haus wie verknüpfe ich das ?


----------



## Leroy42 (6. Jan 2009)

Andrey hat gesagt.:
			
		

> ...du musst deinen Rechner ja auch nicht nach einmaliger benutzung wegwerfen, und mit frischen RAM-Plättchen muss man den PC vor dem Start auch nicht füttern...



 :shock: 

Achso! Gut das du das sagst... (  )


----------



## 0x7F800000 (6. Jan 2009)

@Unknownsyntax


			
				Unkownsyntax hat gesagt.:
			
		

> wenn ich es so schreibe kann ich mit hausliste.add(string); nicht hinzfügen da gibt er mir einen fehler aus....


natürlich, weil Strings eben keine Häuser sind. Schreibe in der haus-Klasse irgendeinen Konstruktor, der Strings akzeptiert, und füge die dann mit

```
hausverwaltung.add(new Haus("name des hauses, was auch immer das sein soll"));
```
ein.
Übrigens, sowas wie "new Hausverwaltung<Haus>" mag zwar semantisch korrekt sein, ergibt rein logisch jedoch äußerst wenig sinn, was soll denn eine "Hausverwaltung" noch außer Häusern verwalten dürfen? Entscheid dich mal was du machen möchtest, Generics als Option wurden hier jetzt erwähnt, jetzt bist du wieder an der reihe.



> zwei listen mit den gleichen namen


 Was soll der name einer Liste sein? Wenn du den bezeichner der Variable meinst, dann ist die Aussage völlig falsch, bezeichner ist keine eigenschaft des Objektes, sondern eben eine referenz darauf. Das Objekt selbst kann und muss nichts davon wissen (es sein denn, du schreibst hier irgendeine abgefahrene Künstliche Intelligenz, die mit Reflection ihren eigenen Aufbau erforschen soll^^)


> und wie könnte ich das am besten machen mit den personen wohnungen usw ... gehört ja immer zu einen haus wie verknüpfe ich das ?


"gehört dazu" klingt schwer nach einer einfachen member-variable in der Haus-Klasse:

```
class Haus{
   private Collection<Bewohner> bewohner;
   private Collection<Möbel> möbel;
   ...
}
```

@Leroy42
ja, bitte sehr^^


----------



## Unkownsyntax (8. Jan 2009)

ich mein wegen dem zwei listen mit den gleichen namen : wenn ich jetzt eine methode schreib wie im programm mit List h = new List also so ein neues haus erstelle und dann wieder die add house methode aufrufe dass es ja zwei listen mit den gleichen namen gibt oder?

Oder sollte ich es lieber so machen dass ich nur eine Liste erstelle mit house z.b. und dann in der liste halt die namen der häuser einfüge und von der liste irgendwie mit zeiger oder so wieder von den namen des hauses weiter zu einer neuen liste mit den wohnungen personen gehe?

Hab da jetzt mal den konstruktor hoffe du hast es so gemeint oder?


```
public Haus(String Adresse){
    
  this.Adresse = Adresse;
  }
```
 
aber was ich nicht verstehe wie du das mit dem code meinst und wo hinzufügen?

```
hausverwaltung.add(new Haus("name des hauses, was auch immer das sein soll"));
```
[/code]


sry für die blöden fargen aber bin halt ziemlich anfänger noch und dass mit den listen will einfach nicht in meinen blöden schädel gehn^^


----------

