# wann static Funktionen wann nicht



## sowieso (23. Feb 2008)

Hi!

Die Klasse "java.lang.Math" verwendet ja keinen Konstruktor. Sind deshalb alle Funktionen static? Die Klasse "java.util.Random" verwendet einen Konstruktor und deshalb sind die Funktionen nicht static?

Also static Funktionen kann man ja aufrufen, ohne eine Klasse instantiieren zu müssen. Instantiieren muss ich die Klasse "Math" ja eh nicht, in sofern kann man alle Funktionen darin static machen. 
Habe ich das richtig verstanden?


----------



## Wildcard (23. Feb 2008)

Jede Klasse hat einen Konstruktor, lediglich die Sichbarkeit kann eingeschränkt sein.
Zu static gilt, alles was static sein _kann_, sollte auch static sein.
Am Anfang ist man jedoch versucht sehr viel static zu verwenden, da man kein Objekt benötigt um eine Methode aufzurufen.
Ich kann dir nur den Tipp geben gar kein static zu benutzen, bis du die OOP wirklich verstanden hast.
Dann wirst du sehen, dass hauptsächlich Konstanten und Utillity Methoden wirklich static sein können.


----------



## sowieso (23. Feb 2008)

Nehmen wir folgendes Beispiel (eine Klasse, die ich mal geschrieben habe):


```
public class RanFunctions
{
	
	private RanFunctions()
	{		
	}

	public static String getRandomElement(List <String> list)
	{
		Random random = new Random();
		int size = list.size();
		int ranIndex = random.nextInt(size);
		String ranElement = list.get(ranIndex);
		return ranElement;
	}
}
```

Habe ich es richtig gemacht, die Funktionen static zu schreiben?


----------



## Wildcard (23. Feb 2008)

Du benötigst keine Examplarvariablen, daher kann die Methode static sein, das ist in Ordnung.


----------



## sowieso (23. Feb 2008)

ok, danke!


----------



## Leroy42 (23. Feb 2008)

Schon richtig, nur würde ich auf die ständige Neu-Instaziierung von Random verzichten
und deshalb auch keine static-Methode benutzen;

```
public class RanFunctions {
	private Random random = new Random();
	public String getRandomElement(List <String> list) {
		return list.get(random.nextInt(list.size()));
	}
}
...
{
	RanFunctions ran = new RanFunctions();
	System.out.println(ran.getRandomElement(myStringList);
	System.out.println(ran.getRandomElement(myStringList);
}
```


----------



## Wildcard (23. Feb 2008)

Was spricht gegen eine statische Referenz auf ein Random Objekt?


----------

