OOP Verständisfrage zu Klassenvariablen

Gustl_Java

Aktives Mitglied
Hallo,

ich benötige eine Variable, eigentlich ein 2-dim array wo ich in jeder klasse erzeuge und dort dann darauf zugreifen und verändern kann.

Da fiel mir die Klassenvariable ein.

Java:
public class Schulstunden 
{ 
  static String[][] school_hours; 
  static 
  { 
    String[][] school_hours= new String[7][];
    for(int i = 0; i < school_hou.length; i++)
       school_hours[i] = new String[24];        

    for(int i = 0; i < school_hours.length; i++) 
       for(int j = 0; j < school_hours[i].length j++)
           school_hours[i][j] = "";
  } 
}

Diese static Methode wird dann wohl nur beim ersten Erzeugen der Klasse aufgerufen?

Somit kann ich ja dann von jeder Klasse, in der ich ein Objekt von Stundenplan erzeuge, darauf zugreifen, abrufen, verändern und sind die Inhalte dann alle gleich, quasi synchron?

Im Moment erzeuge ich das array in jeder klasse neu, und hole es mir im Hauptfenster immer wieder mit getfunktionen ab... das finde ich ziemlich unschön und möchte dafür eine besser lösung.

Danke.
Gruß Gustl
 
Hallo,

ich benötige eine Variable, eigentlich ein 2-dim array wo ich in jeder klasse erzeuge und dort dann darauf zugreifen und verändern kann.

Diese static Methode wird dann wohl nur beim ersten Erzeugen der Klasse aufgerufen?

Beim laden der Klasse Stundenplan

Somit kann ich ja dann von jeder Klasse, in der ich ein Objekt von Stundenplan erzeuge, darauf zugreifen, abrufen, verändern und sind die Inhalte dann alle gleich, quasi synchron?

Jein: Es gibt diese Varibale mit ihrem Inhalt nur einmal. Das heißt der Inhalt ist auch nur einmal da und alle die drauf zugreifen greifen dementsprechend auf das Gleiche zu.

Im Moment erzeuge ich das array in jeder klasse neu, und hole es mir im Hauptfenster immer wieder mit getfunktionen ab...

So wie du das vorhast mit einer Klassenvariable ist es aber meiner Meinung nach noch unschöner. Wenn dann nimm ein Singleton (Entwurfsmuster) ? Wikipedia, und auch da rüber kann man sich streiten da es ja quasi wieder ein statischeer Zugriff ist.
 
Vom objektorientieren Ansatz her ist das -man verzeihe mir- ziemlicher Mist. Über die statische Variable hast du erstens nicht nur eine verkappte globale Variable, was man als Tabu bezeichnen kann, sondern auch nur einen globalen Stundenplan.
Wenn man nun verschiedene Stundenpläne anlegen/verwalten möchte, z.B. für den Schüler Max und für Schülerin Anna, dann ist das damit nicht möglich. Selbst für ein Programm das NUR den eigenen Stundenplan verwaltet, wäre das Unsinn.

Gustl_Java hat gesagt.:
Im Moment erzeuge ich das array in jeder klasse neu, und hole es mir im Hauptfenster immer wieder mit getfunktionen ab... das finde ich ziemlich unschön und möchte dafür eine besser lösung.
Immer neu erzeugen ist natürlich falsch. Du musst einmal einen Stundenplan anlegen und dann daraus deine Informationen holen bzw. sie reinschreiben. Dann ist es vielmehr eine Sache, wie du an den verschiedenen Stellen deines Programms an dieses eine gewisse Stundenplan-Objekt rankommst.
 
Dann ist es vielmehr eine Sache, wie du an den verschiedenen Stellen deines Programms an dieses eine gewisse Stundenplan-Objekt rankommst.

Genau das ist es was mir nicht so gefällt.
In meinem Programm wird nur ein Stundenplan benutzt.
ich habe ein JFrame, von dort aus kann ein JDialog_Stundenplan, JDialog_Ferien und ein JDialog_Noten aufgerufen werden.

Auf das school_hours array muss ich im JFrame, JDialog_Stundenplan und im JDialog_Noten zugreifen können.

Meine Idee jetzt:
Ich erzeuge EINMAL das array im JFrame, übergebe es dem JDialog, und nach beenden des Dialogs hole ich mir dann das, eventuell veränderte, array aus dem JDialog. ISt das eine "saubere" Lösung?

Aber Moment, ist es nicht so das ich dann immer nur die referenz übergebe und ich mir das mit get methoden sparen kann?!

Leider habe ich hier im Moment kein Java auf dem PC und kann es auch nicht testen, aber werde es mal ausprobieren... eigentlich sollte das so gehn!?
 
Na, an einer zentralen Stellen muss einmal der Stundenplan erzeugt werden. Von mir aus ist das der Frame.
Wenn dieser nun einen Dialog öffnet, und der Dialog auch den Plan braucht, kann man den Stundenplan übergeben - ja, intern ist das eine Referenz, also es ist tatsächlich nur ein Objekt, solange du nicht irgendwo ein weiteres new machst.
Also folgender Rahmen-Code würde schon tun:
Java:
public final class MeinHauptFenster extends JFrame
{
    private final StundenPlan meinStundenplan;

    public MeinHauptFenster()
    {
        super("Stundenplan");
        meinStundenplan = new StundenPlan(); //hier wird ein Objekt erzeugt
        // ...
    }
    
    public StundenPlan getStundenplan()
    {
        return meinStundenplan;
    }

    private void zeigeEinenDialog()
    {
        // Variante A:
        JDialog dlg = new MeinDialog(this, "Titel", meinStundenplan); // hier bekommt der Dialog eine Referenz auf den Stundenplan, die muss er intern natürlich speichern
        ...

        // Variante B:
        JDialog dlg = new MeinDialog(this, "Titel"); // hier bekommt der Dialog eine Referenz auf das Hauptfenster, d.h. er kann dort die Methode getStundenplan() aufrufen und bekommt somit das gleiche Stundenplan-Objekt
        ...
        
    }    
}

Die statische Variante mag zwar bequemer wirken, erzeugt aber ne Menge Probleme. Z.B. könnte dann irgendeine Stelle irgendwo im Programm
Java:
Schulstunden.school_hours = null;
machen und schon fliegen dir NullPointerExceptions um die Ohren, ohne dass du leicht nachvollziehen kannst, wieso das Objekt null ist. Das saubere Programmieren fängt halt schon bei kleinen Progrämmchen an 🙂
 

Zurück
Oben