# vorteil/nachteil static



## scrubs (6. Mrz 2008)

Hallo leute,

also, was ist eigentlich der vor/nachteil von statischen variablen und methoden?
ist es nicht einfacher wenn alles statisch sind..dann muss man ja in der aufrufenden klasse keine neuen Instanzen (objekte)  mehr anlegen.. der aufruf erfolgt mit klassenname.methode1....

hmmm sorry ist wirklich ne anfänger frage..=)


----------



## Beni (6. Mrz 2008)

Meine 2 Cents:

Vorteil:
- man hat von überall Zugriff auf statische Elemente
Das kann das Leben wirklich einfacher machen. Besonders wenn man irgendwelche kleinen Hilfs-Methoden benötigt (Math.max...).

Nachteil:
- man hat von überall Zugriff auf statische Elemente
Das kann der Modularität entgegenlaufen. Wenn von überall her zufällig Aufrufe kommen, kann man das statische Element später schlecht ändern/auswechseln/verbessern/löschen/...

- Man ist limitiert auf ein Objekt
Statisch meint meistens "Singleton". Und dann ist die Frage, wann ein Singleton angemessen ist. Da die wenigsten Menschen in die Zukunft schauen können, sollte man eher den sicheren Weg wählen. Und der lautet: vielleicht wird man ein Objekt mehrmals benötigen, und setzt lieber kein Singleton ein.


----------



## 0x7F800000 (6. Mrz 2008)

scrubs hat gesagt.:
			
		

> dann muss man ja in der aufrufenden klasse keine neuen Instanzen (objekte)  mehr anlegen..


...womit man OOP aufgibt und nur noch prozedural programmiert...
wer es sich antun möchte: bitte schön. Dann macht es aber nicht allzuviel sinn Java zu benutzen, dann wär C sicherlich angebrachter


----------



## SlaterB (6. Mrz 2008)

Quark, wenn man etwas mit statischen Operationen gepflegt lösen kann, wie Math.max(), dann spricht nix dagegen und ein Objekt wäre nur unnötiger Ballast

Objekte kommen nur aus zwei Gründen ins Spiel:
1. Daten vorhalten
personObjekt.getName() ist sinniger als AnyClass.getNameOf(Person-Record) früher
(edit: mehrfache Daten)

2. Polymorphie, Austauschbarkeit


----------



## 0x7F800000 (6. Mrz 2008)

SlaterB hat gesagt.:
			
		

> Quark, wenn man etwas mit statischen Operationen gepflegt lösen kann, wie Math.max(), dann spricht nix dagegen und ein Objekt wäre nur unnötiger Ballast


sry für meine schwachen deutschkenntnisse, aber "Quark" hört sich in diesem Kontext so an, als wolltest du irgendeiner vorangegangenen Aussage widersprechen  ???:L  aber Beni hats doch auch als Vorteil beschrieben  :bahnhof: :


			
				Beni hat gesagt.:
			
		

> Vorteil:
> - man hat von überall Zugriff auf statische Elemente
> Das kann das Leben wirklich einfacher machen. Besonders wenn man irgendwelche kleinen Hilfs-Methoden benötigt (Math.max...).



wobei ich überhaupt nicht nachvollziehen kann warum hier überhaupt von "Vorteilen und Nachteilen" gesprochen wird... als ob ihr am Beispiel "Wasser vs. Luft für Homo Sapiens Sapiens" über Vorteile und Nachteile diskutieren würdet. Es sind zwei paar schuhe, und ohne beides ist geht es halt nun mal nicht...


----------



## SlaterB (6. Mrz 2008)

ich meinte:
du sagst 'static allgemein ist nicht OOP [und damit schlecht]'
darauf ich 'nene, OOP ist kein Sebstzweck, static ist ok für Math.max'


----------



## 0x7F800000 (6. Mrz 2008)

ne, das hab ich keineswegs gesagt.  :bae:  du hast einfach einen teil der aussage durchgelesen, ohne das schlüsselwort "alle" davor zu berücksichtigen, ich habs nämlich so gemeint:

```
alles statisch => keine OOP
```
denn die diskussion fing ja damit an:


> ist es nicht einfacher wenn alles statisch sind..dann muss man ja in der aufrufenden klasse keine neuen Instanzen (objekte) mehr anlegen..


du hast es dagegen wie

```
irgendetwas statisch => keine OOP
```
interpretiert, das ist in der tat quark


----------



## SlaterB (6. Mrz 2008)

nun gut


----------



## ms (6. Mrz 2008)

Beni hat gesagt.:
			
		

> Statisch meint meistens "Singleton".


Ich hoffe doch, dass du dich irrst.

ms


----------



## Beni (6. Mrz 2008)

Dann sag mir mal die Hauptanwendung von "static" (abgesehen von kleinen Konstanten) :wink:


----------



## scrubs (6. Mrz 2008)

haha was hab ich da gemacht..

naja worauf ich auf meine frage hinaus will ist..z.B ich hab eine Klasse die Daten aus der DB holt. die Daten werden in ArrayList reingeschrieben. z.B ArrayList KundenID und ArrayList KundenName...
so ist es jetzt besser diese ArrayListe statisch zu setzen oder nicht..
somit kann ich in jeder klasse auf die Listen zugreifen ohne eine Instanz anzulegen... ist das so üblich? oder wählt man eher den anderen weg wo ich sag, ja es muss immer ein Objekt angelegt werden bevor "du" meine Daten kriegst...


----------



## ms (6. Mrz 2008)

Ein statisches Feld welches nicht final ist ist noch lange kein Singleton.

Bsp:
Bevor es enums gab wurde zB mit static häufig enums nachgebildet, welche letztendlich seit Java 1.5 genauso funktionieren wie ihre Vorfahren.


```
class Animal {
    public static final Animal HORSE = new Animal("HORSE");
    public static final Animal DOG = new Animal("DOG");

    private String type = null;

    private Animal(String s) {
        this.type = s;
    }

    public String toString() {
        return type;
    }
}
```

@scrubs
Sowas wird üblicherweise nicht static gemacht.
Könnte ja sein, dass deine Anwendung plötzlich mehrbenutzerfähig oder sogar mit mehreren Threads zurechtkommen soll. Spätestens dann funktioniert dein Ansatz nicht mehr.

ms


----------



## SlaterB (6. Mrz 2008)

ein x-beliebiges Feld in einem Singleton-Objekt ist selber auch noch kein Singleton 

die ganze Klasse Animal ist eine Art Singleton, eine einmalige Ansammlung von Informationen,

okok, streng nach Lehrbuch gibts bestimmte Kriterien, die nicht erfüllt sind, geschenkt,
dem Zweck/ der Anwendung nach ist eine statische Informationsansammlung aber ein Singleton


----------



## scrubs (6. Mrz 2008)

singleton? wasss???


----------



## SlaterB (6. Mrz 2008)

google! genauuu!!!


----------



## chilla (6. Mrz 2008)

naja, ein singleton ist ja trotzdem ein Objekt mit Objektvariablen... welches man referenzieren kann, übergeben, zurückgeben etc. außerdem kann ein singleton im viel größeren sinn mit vererbung arbeiten... ein singleton-thread oder sowas 

während eine klasse mit statischen methoden und statischen variablen mehr sowas wie ein global-player ist, der von überall ansprechbar ist und immer nur klassenvariablen zur verfügung hat.

außerdem wird ein singleton und dessen referenzvariablen immer erst beim aufrug erstellt wohinggegen klassenvariablen schon bei programmstart instanziert werden.(hoff ich irr mich jetz nicht *g*)

das ist doch ein unterschied... 


ps: sry, aber wollt auch mal bissl plappern


----------



## 0x7F800000 (6. Mrz 2008)

scrubs hat gesagt.:
			
		

> naja worauf ich auf meine frage hinaus will ist..z.B ich hab eine Klasse die Daten aus der DB holt. die Daten werden in ArrayList reingeschrieben. z.B ArrayList KundenID und ArrayList KundenName...
> so ist es jetzt besser diese ArrayListe statisch zu setzen oder nicht..



wenn du dir absolut sicher bist, dass du niemals zwei gleichartige instanzen dieser klasse erzeugen willst, die auf verschiedene datenbanken zugreifen, wäre so eine statische liste eigentlich vertretbar... :roll:

singletons brauchst du, wenn du eine konkrete instanz eines objektes brauchst, aber 100% sicher sein willst, dass es nur ein einziges mal erzeugt wird. Wenn dich deine klasse mit den ganzen datenbankverbindungen als ein instanziiertes objekt an sich nirgendwo interessiert, brauchst du das imho nicht...

ps: jo, ich plappere hier auch nur so ein bisschen rum, vielleicht ist es für den op beruhigend zu wissen, dass der nicht der einzige ist, der keine ahnung hat


----------



## scrubs (6. Mrz 2008)

> google! genauuu!!!



ja ja ich weiß


----------



## scrubs (18. Mrz 2008)

hallo leute,

noch eine frage zu static...
bin jetzt irgendwie durchs programmieren, draufgekommen, dass wenn eine statische methode aufgerufen wird, den standard konstruktor und die variablen von der klasse auch mit aufgerufen werden...
kann das stimmen?


----------



## Beni (18. Mrz 2008)

Nein, das kann nicht stimmen. Der Konstruktor von _welchem Objekt_ soll denn aufgerufen werden, die statische Methode gehört ja zu keinem... Du erzeugst dir allenfalls aus Versehen irgendwo ein neues Objekt :wink:


----------

