Daniel: Eigene Objekte in Listen speichern und auslesen?

Hallo!

Ich habe ein kleines Problem mit den Listen in Java.
Und zwar habe ich eine Klasse, zb Auto:

class Auto {

//Objektzustände
private String Marke;
private int Baujahr;

//Hier werden in einer Liste alle neu angelegten Autos gespeichert
static List AutoList = new ArrayList();

public addAuto(String Marke,int Baujahr){
  AutoList.add(new Auto());
  setMarke(Marke);
  setBaujahr(Baujahr);
  }

public void setMarke(String Marke){
  this.Marke = Marke;
  }

public void setBaujahr(String Baujahr){
  this.Baujahr = Baujahr;
  }

public getAuto(int index){
  //Hier möchte ich dann die Werte auslesen
  }

}

Ich weiss nicht inwieweit die Objekte richtig gehandlet werden mit der Liste, aber soweit ich herausgefunden habe, werden die Objekte in der Liste auch nur als Referenz gespeichert, und wenn ich das Objekt, bzw eine Eigenschaft, zb Marke ausgeben will bekomme ich immer die Objektreferenz geliefert.:

AutoList.get(AutoList.size()-1);  ->Referenz

Die Frage lautet nun: Wie kann ich denn auf die gespeicherten Obekte und Methoden in der Liste zugreifen?

Danke,
Daniel

  1. Hallo,

    du hast dir da eine recht interessante Struktur gebastelt: Die Liste
    mit den Auto-Objekten als statisches Objekt in den Auto-Klassen selbst
    zu speichern halte ich für nicht sehr schön.

    Außerdem kann es passieren -- und ich hoffe, ich erinnere mich
    korrekt -- daß der Garbage Collector irgendwann einfach mal deine
    ArrayList "AutoList" wegwirft, da keine (externe) Referenz auf diese
    existiert.
    (Zumindest meine ich mich an einen Fall erinnern zu können, in dem
    dies passiert ist. Das ist leider schon ein Weilchen her, so daß meine
    Erinnerung nicht mehr ganz so frisch ist. Es könnte auch ein anderer
    Effekt bei statischen Variablen gewesen sein.)

    class Auto {

    //Objektzustände
    private String Marke;
    private int Baujahr;

    Du solltest Variablen in Java immer klein schreiben, damit auf einen
    Blick zwischen Klassen- und Variablennamen unterschieden werden kann.

    //Hier werden in einer Liste alle neu angelegten Autos gespeichert
    static List AutoList = new ArrayList();

    public addAuto(String Marke,int Baujahr){

    Was für einen Rückgabewert hat diese Methode? Da fehlt wohl ein "void"
    nach "public". Außerdem sollte die Methode statisch sein, da du ja
    auf die statische Liste zugreifst, die mit der konkreten Auto-Klasse
    nichts zu tun hat.
    (Wie gesagt, deine Struktur ist sehr seltsam.)

    AutoList.add(new Auto());
      setMarke(Marke);
      setBaujahr(Baujahr);
      }

    public void setMarke(String Marke){
      this.Marke = Marke;
      }

    public void setBaujahr(String Baujahr){
      this.Baujahr = Baujahr;
      }

    public getAuto(int index){

    Auch hier fehlt der Rückgabewert. Vermutlich "Auto".
    Außerdem sollte auch diese Methode statisch sein.

    //Hier möchte ich dann die Werte auslesen
      }

    }

    Ich weiss nicht inwieweit die Objekte richtig gehandlet werden mit der Liste,

    Wie willst du es denn?

    aber soweit ich herausgefunden habe, werden die Objekte in der Liste auch nur als Referenz gespeichert,

    Es wird nur eine Referenz in der Liste gespeichert, ja.

    und wenn ich das Objekt, bzw eine Eigenschaft, zb Marke ausgeben will bekomme ich immer die Objektreferenz geliefert.:

    Das verstehe ich nicht.

    AutoList.get(AutoList.size()-1);  ->Referenz

    Ja, das liefert -- sofern du den Rückgabewert noch richtig angibst --
    eine Referenz auf das letzte Auto-Objekt in der Liste.

    Die Frage lautet nun: Wie kann ich denn auf die gespeicherten Obekte und Methoden in der Liste zugreifen?

    Mir ist nicht ganz klar, was du meinst. Meinst du evtl. sowas?
      Auto.getAuto(12).getMarke();

    Dann fehlt aber noch die Methode "getMarke()":
      public String getMarke()
      {
        return Marke;
      }

    Wenn nicht, was meinst du dann?

    Deine Struktur ist wirklich nicht so toll. Schmeiß diese AutoList
    aus deiner Auto-Klasse raus. Die hat da nichts verloren. Erstelle
    zur Verwaltung der Autos eine eigene Klasse oder mach die Verwaltung
    direkt in einer deiner anderen bestehenden Klassen rein.

    Für den 1. Fall:

    public class AutoListe
      {
        List autos = new ArrayList();

    public void addAuto(Auto auto)
        {
           autos.add(auto);
        }

    public Auto getAuto(int index)
        {
           return autos.get(index);
        }
      }

    (Ungetesteter Code. Könnte Fehler enthalten.)

    Gruß
    Slyh

    1. hallo,

      public class AutoListe
        {
          List autos = new ArrayList();

      // ich würde hier noch private hinzufügen (wenn die Liste wirklich privat ist):
             private List autos = new ArrayList();

      public void addAuto(Auto auto) ...

      mit freundlichen grüßen
         dimitri rettig

    2. Hallo Slyh,

      public Auto getAuto(int index)
          {

      return ((Auto)autos).get(index);

      }
        }

      An der Stell muss man leider (noch) casten.

      Grüße

      Daniel

      1. Hallo,

        public Auto getAuto(int index)
            {
                 return ((Auto)autos).get(index);
            }
          }
        An der Stell muss man leider (noch) casten.

        Hast (prinzipiell) recht. Aber wenn casten, dann auch richtig. *g*

        return (Auto)autos.get(index);

        (Du hast die Arrayist nach "Auto" gecastet.)

        Gruß
        Slyh

        1. Hallo Slyh,

          return (Auto)autos.get(index);

          (Du hast die Arrayist nach "Auto" gecastet.)

          Äh ja natürlich muss man den Rückgabewert casten.

          Grüße

          Daniel