*Markus: Wie Instanz aus dem Konstruktor verwenden?

Hallo,

durch mein Kolleg soll ich ein Programm schreiben, in dem die Klassen "Artikel" und "Warenlager" vorkommen. Dabei enthält das Warenlager 1000 Artikel, aber das skurrile an der Sache ist, dass "1000 Artikel" das Attribut von "Warenlager" ist und das Warenlager im Konstruktor instanziert werden soll?
Die ganze Aufgabenstellung ist meiner Meinung nach total unlogisch und nicht durchdacht, da weder eine main-Methode, noch eine Methode erwähnt wird, die Artikel in dieses Warenlager hinzufügen kann, gefolgt von Zweideutigkeiten bei anderen Methoden. Um aber auf mein ursprüngliches Problem zurück zu kommen, habe ich mal die Aufgabenstellen wörtlich genommen und folgendes getippt:

  
public class Warenlager  {  
    Artikel[] warenlager = new Artikel[1000];  
  
    public Warenlager()   {  
        Warenlager warenlager = new Warenlager();  
    }  
.  
.  
.  

Würde ich nun eine main-Methode hinzufügen, und auf die Artikel im Warenlager zugreifen wollen, kann ich das natürlich nicht. Es ist meiner Meinung nach sinnlos, aber vielleicht verbergen sich dahinter noch irgendwelche Java-Eigenschaften, die ich nicht kenne? Welchen Sinn hätte also diese Anweisung?
Für mich hätte es Sinn, "Warenlager warenlager = new Warenlager();" in eine main-Methode zu schreiben, aber nicht in einen Konstruktor.

--
http://www.apostrophitis.at
六 7東曲 人港ラ
  1. Hi,

    durch mein Kolleg soll ich ein Programm schreiben, in dem die Klassen "Artikel" und "Warenlager" vorkommen. Dabei enthält das Warenlager 1000 Artikel, aber das skurrile an der Sache ist, dass "1000 Artikel" das Attribut von "Warenlager" ist und das Warenlager im Konstruktor instanziert werden soll?

    also so auf Anhieb finde ich das gar nicht so unlogisch. Ein Warenlager sammelt eine Menge von Artikeln, in deinem Fall bis zu 1000. Wenn man ein Warenlager anlegt, dann soll eben dieser Speicher vorbereitet werden. Dazu bietet sich der Konstruktor an. Für mich heißt das

      
    public class Warenlager {  
       private Artikel[] gelagerteArtikel;  
      
       public Warenlager() {  
          // Lagerorte anlegen  
          gelagerteArtikel = new Artikel[1000];  
       }  
    }  
    
    

    MfG
    Rouven

    --
    -------------------
    Computer programming is tremendous fun. Like music, it is a skill that derives from an unknown blend of innate talent and constant practice. Like drawing, it can be shaped to a variety of ends: commercial, artistic, and pure entertainment. Programmers have a well-deserved reputation for working long hours but are rarely credited with being driven by creative fevers. Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination, but because their imagination reveals worlds that others cannot see. -- Larry OBrien and Bruce Eckel in Thinking in C#
    1. Hi,

      public class Warenlager {
         private Artikel[] gelagerteArtikel;

      public Warenlager() {
            // Lagerorte anlegen
            gelagerteArtikel = new Artikel[1000];
         }
      }

        
      Dummerweise steht in der Angabe, dass "Warenlager" als Attribut 1000 Artikel haben muss, also wenn ich das richtig verstehe ist das also:  
        
      public class Warenlager  {  
          Artikel[] warenlager = new Artikel[1000];  
        
      und eine Instanz davon in einem Konstruktor ist:  
        
       //   public Warenlager()   {  
      //  Warenlager warenlager = new Warenlager();  
       //   }  
        
        
      P.S. Und wenn ich meine Postings plötzlich nicht mehr sehe, obwohl ich JAVA nicht ausblende, kann ich auch nicht wissen, dass sie bereits drei Mal insgesamt im Forum stehen. Ich dachte an einen anderen Fehler und nicht an einen Fehler, der mit der Ausblendung der Themenbereiche zu tun hat.  
      
      -- 
      <http://www.apostrophitis.at>  
        
      六 7東曲 人港ラ  
        
      ![](http://signatur.pithax.net/gentoo.jpg)
      
  2. Hej,

    durch mein Kolleg soll ich ein Programm schreiben, in dem die Klassen "Artikel" und "Warenlager" vorkommen. Dabei enthält das Warenlager 1000 Artikel, aber das skurrile an der Sache ist, dass "1000 Artikel" das Attribut von "Warenlager" ist und das Warenlager im Konstruktor instanziert werden soll?

    Bitte drück dich etwas deutlicher aus, sollen die Artikel oder das Warenlager selber innerhalb des Konstruktors instanziert werden? Sollen vielleicht die Artikel selber auf das Warenlager referenzieren?

      
    public class Artikel {  
      final private  Warenlager w;  
      
      public Artikel( Warenlager w ) {  
        this.w = w;  
      }  
    }
    

    Oder ist vielleicht gar nicht der Konstruktor gemeint sondern ein Singleton-Pattern?

      
    public final class Warenlager{  
      
      private Warenlager w;  
      private Collection<Artikel> artikel;  
      
      /**  
       * nicht instanzierbar von außen  
       */  
      private Warenlager(){  
        this.artikel = new ...<Artikel>();  
      };  
      
      /**  
       * Hole Warenlager Instanz. In einer VM kann immer nur  
       * höchstens ein Warenlager liegen  
       */  
      public static Warenlager warenlager() {  
        if( this.w == null ) {  
          this.w = new Warenlager();  
        }  
        return this.w;  
      }  
    }
    

    public Warenlager()   {
      Warenlager warenlager = new Warenlager();
    }

      
    Tja, damit hast du zwar die Aufgabe wörtlich erfüllt, aber beim Aufruf würde ich den maximalen Heapspace etwas hochsetzen ,-)  
      
    Beste Grüße  
    Biesterfeld
    
    -- 
    Art.1: Et es wie et es  
    Art.2: Et kütt wie et kütt  
    Art.3: Et hätt noch immer jot jejange  
    [Das Kölsche Grundgesetz](http://isamhaddad.de/stuff/kgg.pdf)
    
    1. Hallo,

      Tja, damit hast du zwar die Aufgabe wörtlich erfüllt, aber beim Aufruf würde ich den maximalen Heapspace etwas hochsetzen ,-)

      Ja, darum geht es mir. Es macht also keinen Sinn, und so etwas teilt man in einer Fachschule als Übungszettel aus. Danke für die Bestätigung.

      Markus

      --
      http://www.apostrophitis.at
      六 7東曲 人港ラ
      1. Hej,

        Tja, damit hast du zwar die Aufgabe wörtlich erfüllt, aber beim Aufruf würde ich den maximalen Heapspace etwas hochsetzen ,-)

        Ja, darum geht es mir. Es macht also keinen Sinn,

        *Das sowieso nicht*

        und so etwas teilt man in einer Fachschule als Übungszettel aus. Danke für die Bestätigung.

        Dann formuliere die Aufgabe bitte exakt wie sie in dem Übungszettel steht. Ganz wichtig: Erwähne bitte auch den Kontext, in dem die Aufgabe erscheint. Geht es um Kapselung, Finalität, Generics, Überschreiben und Überschreibbarkeit, statische Zugriffe?

        Markus

        Schön, dass du deine Beiträge wieder lesen kannst ,-)

        Beste Grüße
        Biesterfeld

        --
        Art.1: Et es wie et es
        Art.2: Et kütt wie et kütt
        Art.3: Et hätt noch immer jot jejange
        Das Kölsche Grundgesetz
        1. Hi,
          *Das sowieso nicht*

          :)

          Dann formuliere die Aufgabe bitte exakt wie sie in dem Übungszettel steht. Ganz wichtig: Erwähne bitte auch den Kontext, in dem die Aufgabe erscheint. Geht es um Kapselung, Finalität, Generics, Überschreiben und Überschreibbarkeit, statische Zugriffe?

          Es geht einfach nur um Kapselung. Im Text steht nichts anderes als, dass die "Klasse Warenlager als Attribut 1000 Artikel" hat und der "Konstruktor das Warenlager instanziert". Genau mit der Fülle an Informationen steht es auf dem Zettel.

          Markus

          --
          http://www.apostrophitis.at
          六 7東曲 人港ラ
          1. Hej,

            Es geht einfach nur um Kapselung.

            In dem Kontext und ...

            Im Text steht nichts anderes als, dass die "Klasse Warenlager als Attribut 1000 Artikel" hat und der "Konstruktor das Warenlager instanziert".

            und wenn man den Autoren zugesteht, dass mit dem Warenlager nicht die Klasse selber, sondern das Attribut welches das Warenlager maßgeblich charakterisiert gemeint ist, würde ich der Lösung von Rouven vollständig zustimmen.

            Beste Grüße
            Biesterfeld

            --
            Art.1: Et es wie et es
            Art.2: Et kütt wie et kütt
            Art.3: Et hätt noch immer jot jejange
            Das Kölsche Grundgesetz
            1. und wenn man den Autoren zugesteht, dass mit dem Warenlager nicht die Klasse selber, sondern das Attribut welches das Warenlager maßgeblich charakterisiert gemeint ist, würde ich der Lösung von Rouven vollständig zustimmen.

              Ich belasse es derweil in der Main-Methode. Danke jedenfalls einstweil.
              Übrigens wurde bei diesem Beispiel im Nachinein auch noch ein Teil mit Vererbung dazugedichtet, den ich zur Übersicht nicht erwähnte, wodurch man aber die ursprünglichen Angaben wahrscheinlich ohnehin verwerfen muss, da es dann z.T. überhaupt nicht mehr nach der Angabe zu lösen ist.

              Markus.

              --
              http://www.apostrophitis.at
              六 7東曲 人港ラ
              1. Hej,

                und wenn man den Autoren zugesteht, dass mit dem Warenlager nicht die Klasse selber, sondern das Attribut welches das Warenlager maßgeblich charakterisiert gemeint ist, würde ich der Lösung von Rouven vollständig zustimmen.

                Ich belasse es derweil in der Main-Methode. Danke jedenfalls einstweil.
                Übrigens wurde bei diesem Beispiel im Nachinein auch noch ein Teil mit Vererbung dazugedichtet,

                Deswegen fragte ich nach der genauen Aufgabenbeschreibung. Übrigens hat das alles nicht viel mit der main()-Methode zu tun. Bei dir geht es gerade um Objetorientiertheit, da isses zunächst mal egal, wo die Objekte instanziert werden, wichtig ist nur, dass sie sinnvolle Konstruktoren zum instanzieren anbieten. So und nun das eigentlich wichtige: Wenn du wie on Rouven vorgeschlagen die "1000 Artikel" im Konstruktor instanzierst (dazu musst du übrigens keine konkreten Artikel haben, vielmehr schusterst du nur das Regal zusammen) kannst du diese Initsialisierung bei einer erbenden Klasse auch beeinflussen.

                  
                public class Warenlager {  
                  protected Artikel[] artikel;  
                  public Warenlager() {  
                    artikel = new Artikel[1000];  
                  }  
                }  
                  
                public class KleinesWarenlager extends Warenlager {  
                  public KleinesWarenlager() {  
                    super();  
                  }  
                  public KleinesWarenlager( int groesse ) {  
                    super.artikel = new Artikel[groesse];  
                  }  
                }
                

                Auch wenn das unter dem Aspekt der Kapselung nicht so sauber wäre. Wenn du aber die Größe in der Variablendeklaration festnagelst, hast du keine Möglichkeit mehr die zu beeinflussen. Schau dir mal z.B. die Implementierung der java.util.ArrayList an, da wird etwas ganz ähnliches gemacht. Wahrscheinlich solltet ihr mit der Übungsaufgabe an das Collection-Framework rangeführt werden.
                Jedenfalls bin ich nicht der Meinung dass die Aufgabe sinnlos gestellt ist. Aber so genau weiß das ja keiner, weil du sie ja nicht preisgeben möchtest.

                Beste Grüße
                Biesterfeld

                --
                Art.1: Et es wie et es
                Art.2: Et kütt wie et kütt
                Art.3: Et hätt noch immer jot jejange
                Das Kölsche Grundgesetz