Superglobale globale Variable?

  • Themenstarter Themenstarter mas
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
M

mas

Gast
Hallo!
Ich hab schon rausgefunden, dass es in Java keine globalen Variable gibt.
Soweit ich das Verstanden habe, gibt es nur Klassenvariablen.
Und Klassenvariablen können natürlich nur innerhalb der betreffenden Klasse anesprochen werden.


Was ist aber jetzt, wenn ich in einer Datenbank, bzw in einem Property File Informationen habe, die
in verschiednen Klassen des Programms benötigt werden.

Muss ich da jedesmal auf die Datenbank (bzw. Property) zugreifen?
Bsp:
In einem PropertyFile steht eine bestimmte Fenstergrösse.
x:500
y:500

Diese Fenstergrösse wird in 5 Klassen meines Progs benötigt.
Muss ich da in jeder Klasse auf das Property bzw. DB zugreifen?

Ich würde mir das gerne ersparen und diese Info nur einmal einlesen, da so ein Datenbankzugriff
ja auch Zeit kostet.

Ich weiß ich könnte alle Informationen am Start in eine Klasse packen und diese dann jeder Klasse in meinem Prog mitübergeben, aber macht man das so? Kann ich mir irgendwie nicht vorstellen.

Hier meine Frage:
Wie macht der "Profi" sowas?

lg
mas
 
mas hat gesagt.:
Ich weiß ich könnte alle Informationen am Start in eine Klasse packen und diese dann jeder Klasse in meinem Prog mitübergeben, aber macht man das so? Kann ich mir irgendwie nicht vorstellen.

Ja das macht man so. Nennt sich Javabean, ein Objekt dass einfach nur Daten hält.
 
mas hat gesagt.:
Soweit ich das Verstanden habe, gibt es nur Klassenvariablen.
Und Klassenvariablen können natürlich nur innerhalb der betreffenden Klasse anesprochen werden.
Das stimmt so nicht - wo eine Variable sichtbar ist, gibt man bei der Deklaration an (public, protected, private oder - wenn kein Access-Modifier angeben wurde - die Default-Sichtbarkeit, die manchmal auch package-protected genannt) wird.

Dann gibt es noch zwei Sorten von Variablen: Instanz- und Klassenvariablen. Erstere existieren innerhalb von Objekten (=Instanzen der jeweiligen Klasse), letztere unabhängig davon.

Irgendwelche globalen Einstellungen kann man z.B. so mit Klassenvariablen ("static") abbilden:

Code:
public class Settings {

public static final int Value1;
public static final int Value2;

static {
  //--- dieser Code wird einmal bei der sog. statischen Initialisierung der Klasse durchlaufen

  /* Hier kommen dann z.B. die DB-Zugriffe */
  Value1 = ...; 
  Value2 = ...;
}

}

Aus anderen Klassen heraus kann man dann einfach so auf die Werte zugreifen:
Code:
int x1 = Settings.Value1;
int x2 = Settings.Value2;
)
 
lies die Daten aus und lass nur eine Instanz dieser Klasse zu (Singleton Pattern)
Code:
class MeineInfoKlasse {
static public MeineInfoKlasse test =null;

static public MeineInfoKlasse getInfoKlasse() {
   if(test!=null)
   {
       test = new MeineInfoKlasse();
   }
   return test;
}

public MeineInfoKlasse() {
   // Infos auslesen und in Attributen speichern (Getter Setter verwenden)
}

public String getInfo1() {
//bla
}
}

Danach kannste aus einer anderen klasse wie folgt zugreifen:
Code:
class Test {

public Test() {
   MeineInfoKlasse.getInfoKlasse().getInfo1(); 
}

}


so in etwa..
 
Murray hat gesagt.:
Code:
public class Settings {

public static final int Value1;
public static final int Value2;

static {
  //--- dieser Code wird einmal bei der sog. statischen Initialisierung der Klasse durchlaufen

  /* Hier kommen dann z.B. die DB-Zugriffe */
  Value1 = ...; 
  Value2 = ...;
}

}

Aus anderen Klassen heraus kann man dann einfach so auf die Werte zugreifen:
Code:
int x1 = Settings.Value1;
int x2 = Settings.Value2;
)

Kann man auch aus anderen Klassen heraus dann die Werte der Variablen ändern?
 
allgemein ja,

final Variablen von Natur aus nicht,
und wenn Änderung dann am besten über eine setX()-Operation
 
dann sind es keine Konstanten mehr 🙂
Erinnert mich spontant an ne Anforderung von nem Kunden...

Kunde hat gesagt.:
Hm, eigentlich bin ich ganz zufrieden damit. Das einzige was wir noch brauchen ist ein optionales Muss-Feld.

...das ist dann im Kunden-Deutsch folgendes:

"Ein Feld dass wie ein Muss-Feld aussieht, aber keines ist."

...macht folgenden Sinn:

"Unsere Vertreter sollen das Feld ausfüllen. Laut Vorgaben [...] ist das Feld aber nicht Pflicht, lediglich wünschenswert. Damit sie nicht merken dass das Feld nicht ausgefüllt werden muss lassen wir es einfach wie ein Muss-Feld aussehen."

:bahnhof: ???:L
 
Zu deinem Problem:
Code:
public class Settings{
   private static String x;

   public static String getX(){
      return x;
   }
   public static void setX(String newX){
      x = newX;
   }
}

// wenn es nur einmal gesetzt werden darf

public class Settings{
   private static String x;
   private static boolean xSet = false;
   public static String getX(){
      return x;
   }
   public static void setX(String newX){
      if(xSet == false){
         x = newX;
         xSet = true;
      }
      // wenn x schon gesetzt wurde darf es nimmer verändert werden
   }
}
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben