Klassenübergreifende Bearbeitung eines Arrays

Status
Nicht offen für weitere Antworten.
Ich stelle mir folgende Programmstruktur vor:

- Class Upro baut im Konstruktor ein Array mit Objekten auf
- Class Main instanziiert Upro und bearbeitet das von Upro erstelle Array.

Ist dieser Ansatz sinnvoll?

Mir ist es nicht gelungen, das Array in Main anzusprechen. Wie könnte so etwas gehen?

Danke!
 
Damit das funktioniert, müsstest du sowas schreiben:
Code:
public class Urpo{
  private int[] array;
  public Urpo(){
    array = new int[ 123 ];
  }
  public int[] getArray(){
    return array;
  }
}
Code:
public class Main{
  public void doSomething(){
    Urpo urpo = new Urpo();
    int[] array = urpo.getArray();
    ...
  }
}

Das Problem: das ist nicht besonders schön. Da soll irgendeine Methode was an dem Array herumbasteln, ohne dass Urpo kontrollieren kann, was mit seinen Werte passiert (viel Spass bei der Fehlersuche... und "objektorientiert" ist das auch nicht sonderlich).

Deshalb würd ich das Array nur in Urpo bearbeiten, oder Urpo so umschreiben, dass Main keinen direkten Zugriff auf das Array hat:
Code:
public class Urpo{
  private int[] array;

  public Urpo(){
    array = new int[ 123 ];
  }

  public int length(){
    return array.length;
  }

  public void set( int value, int index ){
    if( value < 0 )
      throw new IllegalArgumentException( "Momentchen mal, hier sind nur positive Werte erlaubt" );
     array[index] = value;
  }

  public int get( int index ){
    return array[ index ];
  }
}
 
Nach längerer Diskussion und viel Hilfe bin ich zu dem folgenden Ergebnis gekommen:

Hintergrund:

Faulpelze schreiben gern wieder verwendbaren Code. So muß ich in meinem (Spiel)projekt für mehrere Anwendungen die gleichen Daten von einem externen Datenträger einlesen und möchte das nur einmal schreiben. Die Syntax dazu war für mich als Java Anfänger problematisch. Da ich glaube, dass auch andere das gleiche Problem haben, hier ein Beispiel, welches das Ganze aufbröselt.

Main gibt es in diesem Beispiel nur deshalb, um das Ganze standalone testen zu können.


Code:
  public class Erzeugarray                                                                       
  {                                                                                              
  //***********************************************************                                 
          public Erzeugarray[] makeobj ()                  // der Name des Rückgabewertes      
          {                                                // muß gleich dem Klassennamen sein 
                  Erzeugarray[] erzeugarray;                                                    
                  erzeugarray = new Erzeugarray[2];                                         
                  return erzeugarray;                            // !!!! ohne []                
          }                                                                                      
 //***********************************************************                                 
          public static void main(String[] args)                                                
          {                                                                                     
                  Erzeugarray e = new Erzeugarray();                           
                  Erzeugarray [] earray;                       //Deklaration des Arrays  
                  earray = e.makeobj();                                                      
                  for (int i = 0; i < earray.length ; i++)                                 
                  {  System.out.println(earray[i]);   }                                  
          }                                                                                     
   }

In diesem Beispiel ist das Array noch nicht sinnvoll gefüllt. Der Code wird deshalb um
2 Konstruktoren und Code für das Füllen des Arrays erweitert.

Die System.out Anweisung wurde ebenfalls angepasst.


Code:
  public class Erzeugarray                                            
  {                                                                                      
  //*********************************************************** 
          public Erzeugarray() {      }                        //leerer Konstruktor  
          public String field1, field2;                                                         
          public Erzeugarray(String field1, String field2)         // overloaded Konstruktor   
          {       this.field1 = field1;                                                
                  this.field2 = field2;          }                                     
                                                                                              
          public Erzeugarray[] makeobj ()                     // der Name des Rückgabewertes
          {                                                  // muß gleich dem Klassennamen sein
                  Erzeugarray[] erzeugarray;                                             
                  erzeugarray = new Erzeugarray[2];                                 
                  erzeugarray[0] = new Erzeugarray("Feld11","Feld12");      
                  erzeugarray[1] = new Erzeugarray("Feld21","Feld22");      
                  return erzeugarray;                                    // !!!! ohne [] 
          }                                                                                
  //*********************************************************** 
          public static void main(String[] args)                                  
          {                                                                                     
                  Erzeugarray e = new Erzeugarray();                                       
                  Erzeugarray [] earray;                              // Deklaration des Arrays  
                  earray = e.makeobj();                                              
                  for (int i = 0; i < earray.length ; i++)                         
                  {  System.out.println(earray[i].field1);   }                   
          }                                                                                     
   }


Das Ganze ist von den Namen her verwirrend. Um das schöner hinzukriegen,
kann eine eigene Klasse für das Array benutzt werden:

Code:
  public class Data                                                          
  {                                                                                          
  public String field1, field2;                                                              
  public Data (String field1,String field2)        // Konstruktor                           
  {                                    
          this.field1 = field1;   
          this.field2 = field2;   
  }    
  }

Das obige Programm sieht dann so aus:


Code:
  public class Erzeugarray                                                     
  {                                                                                              
  //*********************************************************** 
                                                                                               
          public Data[] makeobj ()                             // der Name des Rückgabewertes
          {  Data[] data;                                   //  muß gleich dem Klassennamen sein
             data = new Data[2];                                                                
             data[0] =  new Data("Feld11","Feld12");                                    
             data[1] =  new Data("Feld12","Feld22");                                    
             return data;                                      // !!!! ohne []                  
          }                                                                                   
  //*********************************************************** 
          public static void main(String[] args)                                              
          {                                                                                     
                  Erzeugarray e = new Erzeugarray();                           
                  Data [] data;                                  // Deklaration des Arrays 
                  data = e.makeobj();                                                            
                  for (int i = 0; i < data.length ; i++)                                       
                  {  System.out.println(data[i].field1);   }                                 
                                                                                                 
          }                                                                                    
   }



An anderer Stelle kann das dann so genutzt werden:

Code:
  public class Nutzearray                                                 
  {                                                                                          
             public static void main(String[] args)                            
                                                                                              
         {                                                                                   
                  Erzeugarray e = new Erzeugarray();                                          
                  Data [] data;                                       // Deklaration des Arrays
                 data = e.makeobj();                                                         
                  for (int i = 0; i < data.length ; i++)                                    
                  {  System.out.println(data[i].field1);   }                              
             
          } 
  }

Edit by Beni: du musst nicht jede Zeile einzeln in Codetags setzen, das funktioniert nicht so!
 
Und nun das Ganze noch einmal richtig formatiert:

Klassenübergreifende Weitergabe von Arrays.

Nach längerer Diskussion und viel Hilfe bin ich zu der folgenden Lösung gekommen:

Hintergrund

Faulpelze schreiben gern wieder verwendbaren Code. So muß ich in meinem (Spiel)projekt für mehrere Anwendungen die gleichen Daten von einem externen Datenträger einlesen und möchte das nur einmal schreiben. Die Syntax dazu war für mich als Java Anfänger problematisch. Da ich glaube, dass auch andere das gleiche Problem haben, hier ein Beispiel, welches das Ganze aufbröselt.

Main gibt es in diesem Beispiel nur deshalb, um das Ganze standalone testen zu können.

Code:
       public class Erzeugarray
        {
        //***********************************************************
                public Erzeugarray[] makeobj ()    // der Name des Rückgabewertes
                {                                                // muß gleich dem Klassennamen sein
                        Erzeugarray[] erzeugarray;
                        erzeugarray = new Erzeugarray[2];
                        return erzeugarray;                          // !!!! ohne []
                }
        //***********************************************************
                public static void main(String[] args)
                {
                        Erzeugarray e = new Erzeugarray();
                        Erzeugarray [] earray;                   //Deklaration des Arrays
                        earray = e.makeobj();
                        for (int i = 0; i < earray.length ; i++)
                        {  System.out.println(earray[i]);   }
                }
         }

In diesem Beispiel ist das Array noch nicht sinnvoll gefüllt. Der Code wird deshalb um
2 Konstruktoren und Code für das Füllen des Arrays erweitert.
Die System.out Anweisung wurde ebenfalls angepasst.


Code:
       public class Erzeugarray
        {
        //***********************************************************
                public Erzeugarray() {      }               //leerer Konstruktor
                public String field1, field2;
                public Erzeugarray(String field1, String field2) // overloaded Konstruktor
                {       this.field1 = field1;
                        this.field2 = field2;          }

                public Erzeugarray[] makeobj ()    // der Name des Rückgabewertes
                {                                                // muß gleich dem Klassennamen sein
                        Erzeugarray[] erzeugarray;
                        erzeugarray = new Erzeugarray[2];
                        erzeugarray[0] = new Erzeugarray("Feld11","Feld12");
                        erzeugarray[1] = new Erzeugarray("Feld21","Feld22");
                        return erzeugarray;                                    // !!!! ohne []
                }
        //***********************************************************
                public static void main(String[] args)
                {
                        Erzeugarray e = new Erzeugarray();
                        Erzeugarray [] earray;               // Deklaration des Arrays
                        earray = e.makeobj();
                        for (int i = 0; i < earray.length ; i++)
                        {  System.out.println(earray[i].field1);   }
                }
         }


Das Ganze ist natürlich von den Namen her verwirrend. Um das schöner hinzukriegen,
kann eine eigene Klasse für das Array benutzt werden:

Code:
      public class Data
        {
        public String field1, field2;
        public Data (String field1,String field2)        // Konstruktor
        {
                this.field1 = field1;
                this.field2 = field2;
        }
        }

Das obige Programm sieht dann so aus:


Code:
       public class Erzeugarray
        {
        //***********************************************************

                public Data[] makeobj ()             // der Name des Rückgabewertes
                {  Data[] data;                           //  muß gleich dem Klassennamen sein
                   data = new Data[2];
                   data[0] =  new Data("Feld11","Feld12");
                   data[1] =  new Data("Feld12","Feld22");
                   return data;                                      // !!!! ohne []
                }
        //***********************************************************
                public static void main(String[] args)
                {
                        Erzeugarray e = new Erzeugarray();
                        Data [] data;                         // Deklaration des Arrays
                        data = e.makeobj();
                        for (int i = 0; i < data.length ; i++)
                        {  System.out.println(data[i].field1);   }

                }
         }



An anderer Stelle kann das dann so genutzt werden:

Code:
        public class Nutzearray
        {
                   public static void main(String[] args)

               {
                        Erzeugarray e = new Erzeugarray();
                        Data [] data;                        // Deklaration des Arrays
                        data = e.makeobj();
                        for (int i = 0; i < data.length ; i++)
                        {  System.out.println(data[i].field1);   }

                }
        }
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben