# globale variablen



## opino (4. Mrz 2008)

hallo forum,

ich habe c, c++ programiert und arbeite mich gerade in Java ein, mit Netbeans habe ich eine GUI erstellt. 
Dort habe ich auf einen Button eine Action gelegt. Außerdem habe ich mir eine Testklasse erstellt.
Wie kann ich inerhalb der 


```
private void newbtActionPerformed(java.awt.event.ActionEvent evt) {
felderfuellen();   
}
```

der Methode mein objekt ansprechen. Gibt es diese Möglichkeit überhaupt?

für eine Antwort wäre ich sehr dankbar.


----------



## Meru (4. Mrz 2008)

Globale Variablen gibt es in Java nicht. Java ist streng Objektorientiert!
Du musst also ein Objekt der Klasse instanzieren, welches die gewünschte Methode enthält und dann kannst du es aufrufen


```
//Achtung -->> pseudocode

ClassA{
  public ClassA(){
  }
  
  public void felderfuellen(){
    // tu dies, tu das
  }
}


ClassB{
  ...
  ...

  ClassA aaa = new ClassA();
  ...
  ...

  private void newbtActionPerformed(java.awt.event.ActionEvent evt) {
    aaa.felderfuellen();   
  }

  ...
  ...
```


----------



## The_S (5. Mrz 2008)

Oder eine öffentliche, statische Variable in einer Klasse. Das sollte noch am ehesten der Vorstellung einer globalen Variable entsprechen.


----------



## Marco13 (5. Mrz 2008)

Hobbit_Im_Blutrausch hat gesagt.:
			
		

> Oder eine XXXXXX :autsch:  XXXXXXXXX. Das sollte noch am ehesten der Vorstellung einer globalen Variable entsprechen.


Eigentlich hätte ich von dir nicht solche Empfehlungen erwartet  :noe:


----------



## The_S (5. Mrz 2008)

Wenn er UNBEDINGT so etwas haben will, bitte. Die Möglichkeit gibt es nunmal, und wenn ich sie ihm nicht  sage, dann bekommt er sie irgendwo anders her. Für Anfänger ist es vorallem zu Beginn nicht einfach OO zu denken und einzusetzen. Und bevor er die Lust am Programmieren verliert, weil er es momentan noch nicht anderst umsetzen kann (Gedankengänge z. B.), dann soll er es lieber so machen, und sich dann in ein paar Monaten denken (wenn er dann seinen Code nochmal anschaut) "Was hab ich denn da für scheiße programmiert?". War bei mir nicht anders  .

Dass soetwas gegen jeden OO-Grundgedanken verstößt brauch ich wohl nicht weiter erwähnen.


----------



## trazzag (5. Mrz 2008)

dann gibt's da ja noch die Möglichkeit globale Variablen über das Singleton-Muster zu realisieren (ist ja nicht wirklich was anderes).


----------



## 0x7F800000 (5. Mrz 2008)

@leute:
 ihr denkt da irgendwie in falsche richtung... dem OP gings primär nicht um globale variablen, sondern darum, wie er aus dieser methode irgendein sonstwo instanziiertes objekt anspricht.

@opino: mir ist leider nicht so wirklich klar geworden, was du mit


> mein objekt ansprechen


meinst... kommt ja drauf an wo das objekt ist und wo du diese methode definiert hast... Wenn das objekt selbst den Listener implementiert, und diese methode beinhaltet, dann kannst du darauf einfach direkt zugreifen. Aber diesem Code-Ausschnitt kann man nicht entnehmen wo was ist...


----------



## ms (5. Mrz 2008)

trazzag hat gesagt.:
			
		

> dann gibt's da ja noch die Möglichkeit globale Variablen über das Singleton-Muster zu realisieren (ist ja nicht wirklich was anderes).


arrrrhhhhhhg ... ich glaub bei der nächsten Singleton-Empfehlung vergesse ich mich.

ms


----------



## The_S (5. Mrz 2008)

Andrey hat gesagt.:
			
		

> @leute:
> ihr denkt da irgendwie in falsche richtung... dem OP gings primär nicht um globale variablen, sondern darum, wie er aus dieser methode irgendein sonstwo instanziiertes objekt anspricht.



Der Titel ist aber so verleitend. Ich neige dann immer dazu mir den Text nicht durchzulesen oder nur zu überfliegen  .


----------



## trazzag (5. Mrz 2008)

ms hat gesagt.:
			
		

> trazzag hat gesagt.:
> 
> 
> 
> ...



Das war ja keine Empfehlung, sondern nur das Aufzeigen einer Möglichkeit. Aber was spricht prinzipiell gegen Singleton? Ich denke schon, daß dieses Entwurfsmuster in manchen Anwendungsfällen durchaus seine Berechtigung hat!


----------



## 0x7F800000 (5. Mrz 2008)

ja, aber ein singleton, um die referenz von irgendeinem objekt an einen action listener zu übergeben? :autsch:  hallo?  :bae:


----------



## trazzag (5. Mrz 2008)

das singleton hier eher nicht eingesetzt werde sollte, ist ja unstrittig - gib mir doch nur um die vollständigkeit der Möglichkeiten ;-)


----------



## Saxony (5. Mrz 2008)

Hier gibt es schon eine Diskussion zu Singleton.


----------



## 0x7F800000 (5. Mrz 2008)

okay... singletons sind unter umständen keine singletons mehr wenn es mehrere classloader gibt. super. zur kenntnis genommen.  :toll:  Glaube aber kaum das opino damit bei seiner gui-frage viel weitergekommen ist


----------



## ARadauer (5. Mrz 2008)

> aus dieser methode irgendein sonstwo instanziiertes objekt anspricht.


is das nicht, etwas was man auf keinen fall machen soll.
da kann ich ja gleich schon alles public static machen und in eine klasse werfen.

also konkret zum problem zurück:

```
private void newbtActionPerformed(java.awt.event.ActionEvent evt) { 
felderfuellen();    
}
```
wenn du hier eine methode eines fremden objektes aufrufen willst, so wär es sinnvoll, wenn dein objekt eine refernz auf das fremde objekte hat. 

zb du hast eine gui und willst jetzt in der gui eine methode des controller aufrufen.

entweder instanziert dein controller die gui und gibt sich selber mit oder eine andere klasse instanziert controller und gui und setzt den controller in die gui.


----------



## 0x7F800000 (5. Mrz 2008)

ARadauer hat gesagt.:
			
		

> > aus dieser methode irgendein sonstwo instanziiertes objekt anspricht.
> 
> 
> is das nicht, etwas was man auf keinen fall machen soll.


ich versteh nicht was du sagen wolltest... "man soll auf keinen fall objekte ansprechen" oder wie?^^


----------



## opino (5. Mrz 2008)

Vielen dank für die vielen Beiträge. 
Ich habe mir gestern noch ein Tachenrechnerbeispiel aus dem Forum gezogen und das durchgeschaut.

Mein Fehler war das ich die Objekte in Klassenmethoden definiert habe und ich sie somit ich in anderen Methoden 
ansprechen konnte.
Ich definiere meine Objekte nun gleich zu begin der Klasse und kann diese nun auch von überall ansprechen.

Noch einmal vielen dank für die vielen Antworten.


----------



## Meru (5. Mrz 2008)

Marco13 hat gesagt.:
			
		

> Hobbit_Im_Blutrausch hat gesagt.:
> 
> 
> 
> ...



So kann man das nicht sagen. Klar macht es Sinn, statische Werte auf diese Weise fest zu definieren.

Beispiel:


```
JLabel la = new JLabel("blabla", JLabel.NORTH_EAST);

JPanel panel = new JPanel(new BorderLayout());
panel.add(new JButton(), BorderLayount.NORTH);

etc.
etc.
etc.
```

Genauso kann man sich eigene Sachen die so "superglobal" und statisch sind definieren.

Beispielsweise habe ich eine Klasse, dass wenn ich der ein JLabel mit einem Wert übergebe, das Aussehen verändern


mySetComponent(JLabel, MyDesign.STYLE_TITLE); 

etc.


----------



## Marco13 (5. Mrz 2008)

Die "Variablen", von denen du jetzt redest sind eigentlich eher _Konstanten_ :wink: Natürlich sind public static *final* Objekte für viele Dinge OK. Aber wenn man das "final" wegläßt, hat man IMHO irgendwas falsch gemacht.


----------



## Meru (6. Mrz 2008)

Ich kenne "globale" variablen eigentlich nur als Konstanten, daher meine Annahme, das er dies meinte. An den anderen Fall ohne final habe ich in diesem Moment nicht gedacht. Dann will ich mich mal entschuldigen das ich zu schnell geschossen habe


----------



## Janus (6. Mrz 2008)

ich empfehle eher, die "richtige" klasse als listener zu registrieren. wenn die das event empfangende klasse nicht die entsprechenden methoden anbietet, die gerufen werden sollen, dann ist sie wahrscheinlich der falsche listener.

ansonsten ist es aber richtig, dass eine klasse eine referenz auf ein anderes objekt benötigt, wenn sie an diesem methoden aufrufen will. wenn man nicht das gesamte interface zur verfügung stellen möchte, arbeitet man in java üblicherweise mit callbacks.


----------



## ms (6. Mrz 2008)

Janus hat gesagt.:
			
		

> wenn man nicht das gesamte interface zur verfügung stellen möchte, arbeitet man in java üblicherweise mit callbacks.


 ???:L 
Vielleicht meinst du ja das Richtige - nur klingt es nicht verständlich.

ms


----------

