Globale vs. Lokale Variablen

steff aka sId

Erfahrenes Mitglied
Hi ich hab einmal eine Grundsatzfrage.
Womit sollte man eher arbeiten mit globalen oder lokalen Variablen? Bzw. wo ist es sinvoll globale Variablen zu nutzen und wo ist es eher sinnvoll lokale Variablen zu nutzen?
Greetz Steff
 
In Java als objektorientierte Programmiersprache sollte man möglichst immer lokale bzw. private Variablen verwenden.
Static ist soweit, wie möglich, zu vermeiden, wenn man mal von der main-Methode und einigen Spezialfällen, die zum Beispiel aus den Design-Pattern-Konzepten von Gamma hervorgehen, absieht.

Oder meinst Du den Unterschied zwischen Variablen, die für die Klasse (für die Instanzen der Klasse) und welchen die innerhalb einer Funktion definiert sind? Dann sollte man nur die Variablen in die Klasse aufnehmen, die das Objekt bei weiteren Funktionsaufrufen auch braucht.
 
Ja meine Frage bezieht sich auf den 2. Punkt also mit lokalen Variablen meine ich Variablen die innerhalb einer Metode deklariert sind und mit globalen die Variablen die innerhalb der Klasse als Objektvariablen deklariert sind.
Gruß Steff
 
Hallo!

ich denke das es eigentlich nur sehr wenige gute Gründe dafür gibt, in Java "Gloable Variablen" -> (öffenltiche Klassenvariablen (public static TYPE foo ...) ) zu verwenden.

1) Zur Definition von Konstanten
2) Zur Realisierung von Singletons.

Was man dann unter "lokalen Variablen" versteht hängt dann davon ab, ob man Methoden Lokale oder "Instanz Lokale" -> Membervariablen meint. Diese unterschieden sich nämlich hinlänglich ihres Initialisierungs - und Sichtbarkeitsverhaltens.

Membervariablen werden automatisch mit ihren jeweiligen Default Werten initialisiert und Lokale Variablen eben nicht. Weiterhin sind Instanz Varaiblen über mehrere Methodenaufrufe hin sichtbar wohingegen Methoden lokale Variablen eben nur in jener Methode "leben".

Gruß Tom
 
Auch, wenn es jetzt die Frage verfehlt:
Selbst einen Singleton würde ich ohne public static Variable machen.
Mir gefällt da das Konzept der "public static Klassenname getInstance()" - Methode in Verbindung mit einer "private static Klassenname singleInstance" besser.
So kann ich nämlich zu jeder Zeit sicher sein, dass das Singleton-Objekt initialisiert ist bzw. für den Aufruf initialisiert wird.

Ich versuche mich jetzt mal an einer möglichen Faustregel (nehmt sie auseinander oder verbessert sie, vielleicht finden wir ja eine gemeinsame Richtlinie):
Instanz-Variablen nutzt man, für Daten, die zu dem Datenstamm des Objekts gehören.
Dazu gehören Daten, die die Eigenschaften des Objekts definieren (z.B. name, vorName und haarFarbe für eine Klasse Person) und Konstanten (die als static), die als Eigenschaften für Funktionsaufrufe oder Instanzvariablen dienen (z.B. BLOND, BRUNETTE, SCHWARZ, ROT für genannte Klasse Person).
Alle anderen Variablen (z.B. Laufvariablen) gehören in die Methoden, in denen sie Verwendet werden.

Ausnahmen gibt es natürlich immer.

Gruß hpvw
 
Hallo!

Du hast natürlich recht. Ich finde das Singleton-Pattern auf basis von privaten Klassenmembers auch besser...

Deine Fastregel kann man so stehen lassen, jedoch würde ich noch hinzufügen, dass man für Konstanten (um die Typ- und Wertsicherheit) zu behalten das Enum Pattern anwenden sollte.

Gruß Tom
 
Thomas Darimont hat gesagt.:
... hinzufügen, dass man für Konstanten (um die Typ- und Wertsicherheit) zu behalten das Enum Pattern anwenden sollte.
Kommt das auch von Gamma?
Dann müsste ich die dt. Übersetzung, die ich mir wegen dem Risiko durch meine Englischkenntnisse zugelegt habe, ja verfluchen da taucht es nämlich nicht auf.
Kannst Du es vielleicht knapp erläutern? *sorryhijackingathread*
Nach der vagen Vorstellung, die ich mir gerade vom Enum-Pattern mache, würde ich Dir recht geben :rolleyes:
 
Hallo!

Nochmal zu den Singletons... ich würde sogar empfehlen diese so zu Implementieren

Code:
/*
 * Created on 07.01.2005@17:37:18
 *
 * TODO Licence info
 */
package de.tutorials;

/**
 * @author Administrator
 * 
 * TODO Explain me...
 */
public class Singleton {
	private static Singleton instance;

	protected Singleton() {
	}

	public static Singleton getInstance() {
		if (instance == null) {
			synchronized (Singleton.class) {
				instance = new Singleton();
			}
		}
		return instance;
	}
}

wenn man nämlich den Konstruktor als protected deklariert kann man noch von dieser Klasse ableiten, was bei einem privaten Konstruktor nicht mehr möglich wäre.

@hpvw
Schau doch mal hier:
http://www.tutorials.de/tutorials184160.html&highlight=Enum

Gruß Tom
 
Thomas Darimont hat gesagt.:
Hallo!

Nochmal zu den Singletons... ich würde sogar empfehlen diese so zu Implementieren

Code:
/*
 * Created on 07.01.2005@17:37:18
 *
 * TODO Licence info
 */
package de.tutorials;

/**
 * @author Administrator
 * 
 * TODO Explain me...
 */
public class Singleton {
	private static Singleton instance;

	protected Singleton() {
	}

	public Singleton getInstance() {
		if (instance == null) {
			synchronized (Singleton.class) {
				instance = new Singleton();
			}
		}
		return instance;
	}
}

wenn man nämlich den Konstruktor als protected deklariert kann man noch von dieser Klasse ableiten, was bei einem privaten Konstruktor nicht mehr möglich wäre.

@hpvw
Schau doch mal hier:
http://www.tutorials.de/tutorials184160.html&highlight=Enum

Gruß Tom
Code:
public Singleton getInstance();
sollte aber wahrsch. static sein ;)

Gruß

RedWing


... Huch ... ja natürlich ;-)

Gruß Tom
 
Sehr elegant, mit dem synchronized, da hab ich bisher immer Glück gehabt :eek:
Ich denke auch, wie RedWing, dass Du bei getInstance wohl noch static meintest.
protected...: So langsam geht der/die/das Singleton in Synthese mit der Factory Method :D

Danke für den Link mit den Enum's. Ist wohl doch noch etwas mehr, als ich im Kopf hatte.
Das sieht auf jeden Fall vernünftig und interessant aus, ist aber wohl für die meisten meiner Projekte zuviel des Guten.

Gruß hpvw
 
Zurück