ArrayList und Java

Status
Nicht offen für weitere Antworten.

battle4ngel

Mitglied
Hi,

ich habe eine Klasse

Code:
public class DataModelSab
{
    private String zbnr;
//Gekürzt

     public void fillDataModel(Sheet sheet, int zeile)
     {
   //Ich hol die Daten aus nem xls sheet mit jxl
        zbnr = sheet.getCell(0, zeile).getContents();
     }
}

Eine weiter Klasse verwendet die fillDataModel methode
Code:
public class Sab 
{
    public ArrayList a = new ArrayList();
    
    public Sab() 
    {
    // Das sheet ist ein xls Worksheet das ich in einer anderen Funktion öffne
        validate(sheet);
    }
    
    validate(Worksheet sheet)
    {
         int zeile = 0;
         DataModelSab model = new DataModelSab();
     
        for(zeile = 0; zeile < 10; zeile ++)
        {
            model.fillDataModel(sheet, zeile);
            a.add(model);
         }
    } 
}

wenn ich so das add für die ArrayList mache, steht allerdings immer der gleiche Wert in der ArrayList, ich denke das es daran liegt, das Java mit Referenzen arbeitet und ich beim neuen fill noch die Referenz auf das xte Feld im Array Element habe. Wie man vielleicht merkt komm ich aus der C Welt und die einzige Lösung die mir zu dem Problem eingefallen ist, wäre folgendes:

Code:
public class Sab 
{
    public ArrayList a = new ArrayList();
    
    public Sab() 
    {
        validate(sheet);
    }
    
    validate(Worksheet sheet)
    {
         int zeile = 0;
       
     
        for(zeile = 0; zeile < 10; zeile ++)
        {
              a.add(fill(zeile));
         }
    } 
}

Code:
    private DataModelSab fill(int zeile)
    {
        DataModelSab model = new DataModelSab();
        model.fillDataModel(sheet, zeile);
        return model;
        
    }

ich muß aber ehrlich sagen das ich das nicht sonderlich schön finde, gibt es eine andere Möglichkeit? Oder funktioniert es nur durch Zufall wenn ich das model.fillDataModel in eine andere Funktion packe? Von meinem Gefühl her würde ich jetzt einen destructor deklarieren und gut wärs gewesen, bzw. hätte das Problem vermutlich in C/C++ nicht (zumindestens glaub ich das) weil direkt mit Kopien gearbeitet wird. Najo wär nett wenn mir jemand sagen kann wieso es nicht funktioniert und wie ich das geschickt umgehen kann (= .
btw. wenn Formatfehler auftauchen, Klammerfehler oder ich vergessen habe Variablen zu übergeben/zu deklarieren, es ist wie gesagt nur ein Ausschnitt eines relativ großen Programms und eigentlich Funktioniert es gut bis auf die Probleme mit dem ListArray.

mfg

Marijke
 
Code:
   validate(Worksheet sheet) 
    { 
         int zeile = 0; 
         DataModelSab model = new DataModelSab(); 
      
        for(zeile = 0; zeile < 10; zeile ++) 
        { 
            model.fillDataModel(sheet, zeile); 
            a.add(model); 
         } 
    }

Dein Problem ist, daß du nur eine DataModelSab Instanz erzeugst,
deren Inhalt dann in der Schleife immer wieder verändert wird.

Durch a.add(model) wird nicht der Inhalt von model eingefügt, sondern,
wie du schon erkannt hast, nur die Referenz auf die Instanz. Dadurch enthält
deine Liste am Ende 10 identische Referenzen, die alle auf die zuletzt gefüllten
Werte verweisen.

Da du 10 verschiedene DataModelSabs haben willst, mußt du auch genausoviel erzeugen:

Code:
   validate(Worksheet sheet) 
    { 
         int zeile = 0;    // Diese Deklaration ist unnötige, schieb sie einfach in die for-Schleife
      
        for(zeile = 0; zeile < 10; zeile ++) 
        { 
            DataModelSab model = new DataModelSab(); 
            model.fillDataModel(sheet, zeile); 
            a.add(model); 
         } 
    }
 
Übrigens
battle4ngel hat gesagt.:
...hätte das Problem vermutlich in C/C++ nicht weil direkt mit Kopien gearbeitet wird.
Richtig! 😀

Intern passiert in C aber genau das gleiche. Es wird eine Kopie (neue Instanz) erzeugt, in die
alle Werte hineinkopiert werden, was zusätzlichen unnötigen Aufwand bedeutet.

Das dies in Java so nicht geht ist eher ein Vorteil! Da kann es dir nicht passieren, daß du,
in díesem Fall, ineffizient codest :bae:
Denn auch in C/C++ solltest du die Instanzen selbst kreieren, ohne daß der Compiler Anweisungen
zum Kopieren einfügen muß 😎
 
Hi,

danke dir, ich hab mir, wie schon geschrieben, gedacht das es an den Referenzen liegt, aber keine wirkliche Lösung parat gehabt.

Denn auch in C/C++ solltest du die Instanzen selbst kreieren, ohne daß der Compiler Anweisungen
zum Kopieren einfügen muß 😎

Ich weiß, nur sträubt sich in mir immer etwas wenn ich ne new Anweisung mache aber am ende kein delete oder free oder sonstiges -.- ich glaub da muß ich noch etwas an mir arbeiten 😀

mfg

Marijke
 
Hi nochmal,


ich erzeuge jetzt genausoviele Objekte wie ich benötige. Allerdings stehe ich jetzt vor einem anderen Problem, denn das Programm braucht sehr lange um ca. 400 Objekte zu erzeugen.
Während der Erzeugung ist die Prozessorlast allerdings immer bei 10%, ist das bei Java normal? ???:L


mfg

Marijke
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben