Static (Informatik)

aus Wikipedia, der freien Enzyklopädie
Wechseln zu: Navigation, Suche

static ist ein Zusatz bei der Deklaration von Variablen in Programmiersprachen wie C, C++, Java oder C#, VB.NET.

static als Speicherklasse[Bearbeiten]

Die Speicherklasse static definiert die „Lebenszeit“ und die Bindung einer Variable – sie wird während der kompletten Laufzeit einer Übersetzungseinheit existieren bzw. den letzten zugewiesenen Wert tragen; fremde Übersetzungseinheiten sehen bei direktem Zugriff prinzipiell nur unabhängige Kopien. Soll zum Beispiel der tatsächliche, aktuelle Wert der statischen Variable A aus Übersetzungseinheit X ausgelesen werden, so muss zwangsläufig eine Funktion/Methode/Eigenschaft oder Schnittstelle aus Einheit X genutzt werden; ohne diese ist A immer eine (ggf. statisch initialisierte) Kopie für Einheit Y.

static als Typqualifikator[Bearbeiten]

In C und C++ wird durch diesen Typqualifikator spezifiziert, dass die zugewiesene Variable innerhalb dieser Klasse und Instanzen-unabhängig nur ein einziges Mal physikalisch existiert. Solche Daten sind besonders innerhalb von Multithreading-Prozessen oder bei Verwendung mehrerer Prozesse relevant, beispielsweise beim gemeinsamen Zugriff auf eindeutige Datenfelder – in einem solchen Szenario könnte ein Mutex mittels static deklariert werden und so eine Sequentialisierung der Datenzugriffe verschiedener Threads ermöglichen.

Auch als eindeutiges Datenfeld kann static dienlich sein; beispielsweise kann es unter Umständen sinnvoll sein, eine Ethernet-Datenverbindung (siehe auch Socket) derart zu deklarieren. Zugriffe auf diese Verbindung können dann über eine umgebende Klasse oder ein Modul stattfinden und z. B. zusätzliche Funktionalität zur Flusssteuerung beinhalten – ein reales Beispiel wäre eine TCP-Schnittstelle für einen RS232-Port, da der Port keine Mehrfachverbindungen erlaubt, wäre eine Mehrfachkonnektierung diverser LAN- bzw. WAN-Clients nur mit Zusatzaufwand machbar.

Beispiel in VB.NET[Bearbeiten]

In VB.NET wird das Schlüsselwort Static nur innerhalb einer Methode[1] als Suffix für eine lokale Variable verwendet. Es kennzeichnet, dass die Variable nicht bei jedem Methodenaufruf neu initialisiert wird, sondern den Wert annimmt, den sie beim vorherigen Methodenaufruf zuletzt hatte (Lebensdauer = Programmlebensdauer). Dass ein Klassenmember unabhängig von einer Instanz verwendet werden kann wird - abweichend von anderen Sprachen - mit dem Schlüsselwort Shared[2] markiert. In den CLI-Sprachen können keine Member außerhalb einer Klasse stehen und einen Linker gibt es dort ebenfalls nicht, so dass die Bedeutung der geringeren Sichtbarkeit für den Linker ebenfalls entfällt. Damit hat in VB.Net das Static-Schlüsselwort eine eindeutige, kontextunabhängige Bedeutung.

Das folgende Beispiel zeigt eine banale Anwendung innerhalb von Threads; eine Static-Variable wird nur ein einziges Mal initialisiert, selbst dann, wenn die aktuelle Prozedur/die aktuelle Thread-Iteration bereits beendet wurde und der Logik nach ein anderer Thread nun reinitialisieren sollte:

Imports System.Threading
Public Class StaticDemo
   Private Shared ReadOnly mMutex As New Mutex                                       '1 Kopie für alle Threads => Shared
   Public Sub StartThreads()
      For i As UInteger = 1 To 10
         ThreadPool.QueueUserWorkItem(New WaitCallback(AddressOf IncrementThread))   '10 Threads starten
      Next
   End Sub
 
   Private Sub IncrementThread()
      Dim tId As Integer = Thread.CurrentThread.ManagedThreadId                      'hier kann jeder Zugriff verfolgt werden
      Static mNumber As UInteger = 0                                                 '1 Kopie für alle Threads, Kontextbeschränkt => Static
 
      While mMutex.WaitOne         
         mNumber += 1
         mMutex.ReleaseMutex()
      End While
 
    End Sub
End Class

Beispiel in C[Bearbeiten]

In C fungiert static als Reduzierung der Sichtbarkeit (beim Symbolexport) wenn es außerhalb einer Methode geschrieben wird, und als Erweiterung der Lebensdauer, wenn es an eine Variable innerhalb einer Methode geschrieben wird.

Das folgende Beispiel zeigt die Funktionalität dieses Schlüsselwortes in C:

#include <stdio.h>
 
static void func(void) {   // Das Symbol func wird vom Compiler nicht exportiert - wenn ein anderes Modul func deklariert aber nicht implentiert führt das zu einem Linker-Fehler
        static int x = 0;  // x wird nur ein einziges Mal initialisiert, trotz der Mehrfachaufrufe in main()
        printf("%d\n", x); // gibt den Wert von x aus
        x = x + 1;
}
 
int main(int argc, char * const argv[]) {
        func();            // Ausgabe : 0
        func();            // Ausgabe : 1
        func();            // Ausgabe : 2
        return 0;
}

Beispiel in C++[Bearbeiten]

In C++ hat static drei Bedeutungen: static auf Modul- bzw. Namespace-Ebene begrenzt die Sichtbarkeit für den Linker. static auf Klassenebene sorgt dafür, dass der Member an keine Klasseninstanz gebunden wird. static auf Methodenebene sorgt hingegen dafür, dass die Lebensdauer der Variable auf die Programmlaufzeit ausgedehnt wird.

Folgendes Beispiel zeigt die im Gegensatz zu C hinzugekommene Bedeutung von static:

//Request.hpp
class Request
{
private:
	static int count;  //Instanzunabhängiger Zähler für alle Aufrufe
	string url;
 
public:
	Request()  { count++; }
	string getUrl()  const  { return url; }
	void setUrl(string value)  { url = value; }
	static int getCount()  { return count; }
};

Es gibt keine statischen Konstruktoren, die Initialisierung des Zählers erfolgt in Quelldatei ohne Methodenkontext.

//Request.cpp
#include "Request.hpp"
int Request::count = 0; //Initialisierung des Zählers im .cpp- File

C#, Java[Bearbeiten]

In den verwalteten objektorientierten C-oiden Sprachen Java und C# ist das static-Schlüsselwort ebenfalls kontextabhängig, die geringere Sichtbarkeit für den Linker entfällt jedoch bei diesen Sprachen, so dass noch analog zu C++ und VB.Net die Instanzunabhängigkeit auf Klassenebene und die Lebensdauer Programmlaufzeit auf Methodenebene bleiben.

Zur Initialisierung von instanzunabhängigen Membern gibt es statische Konstruktoren, die keine Parameter annehmen können und vor dem ersten Aufruf eines statischen Members und vor dem Erstellen der ersten Klasseninstanz automatisch aufgerufen werden. Sie werden ebenfalls mit dem static-Schlüsselwort als solche markiert.

Java:

class Beispiel {
  static {
    //...
  }
}

C#:

class Beispiel {
  static Beispiel() {
    //...
  }
}

Einzelnachweise[Bearbeiten]

  1. Vorlage:Internetquelle/Wartung/Zugriffsdatum nicht im ISO-FormatStatic (Visual Basic). Microsoft, abgerufen am 28. Oktober 2012 (deutsch).
  2. Vorlage:Internetquelle/Wartung/Zugriffsdatum nicht im ISO-FormatShared (Visual Basic). Microsoft, abgerufen am 28. Oktober 2012 (deutsch).

Weblinks[Bearbeiten]