# Warum static-Methoden nutzen



## KartoffelKiffer (4. Mai 2007)

Hallo,

in meinem Methoden verwende ich fast grundsätzlich das Attribut static, so erspare ich mir etwas Schreibaufwand um "nur mal eben diese Methode aufzurufen", ich muss also nicht etxra eine Instanz davon bilden.

Ein Arbeitskollege meinte nun ich solle das besser lassen und auf das static-Attribut verzichten, es nur im Notfall gebrauchen.

Hat er da recht? Oder kann ich meinem geliebten static treu-bleiben und es weiterhin ohne Skrupel benutzen?



Mfg Tom


----------



## MQue (4. Mai 2007)

auf jeden Fall hat dein Arbeitskollege recht, wenn du bei allen Methoden static dazuschreibst, dann handelt es sich erstens um Funktionen und nicht um Methoden und du kannst dann auch gleich eine andere Programmiersprache verwenden (z.B.: C/C++) -> in C ist nämlich auch alles so aufgebaut wie wenn du in Java bei den Methoden überall static dazuschreibst.
static- Methoden (Klassenmethoden) nur sehr beschränkt implementieren (z.B.: wenn alle Objekte der Klasse die eine gemeinsame Variable benutzen -> z.B: ein Instanzenzähler).

Ich würd mit den static- Methoden vorsichtig sein: static- Methoden können auch keine Objekt- Methoden aufrufen, ich glaub, da kommt man in teufels Küche.

lg
Michl


----------



## SlaterB (4. Mai 2007)

andererseits hat man oft hunderte Hilfoperationen so wie in der Math-Klasse,
für diese macht es absolut keine Probleme, diese statisch zu lassen

oder Integer.parseInt(), sollte man da new Integer().parseInt() aufrufen? 

beides hat seine Berechtigung, 
man kann mit static viel falsch machen, aber wenn man sowas falsch macht, dann ist die Frage, ob man mit normalen Objekten wirklich besser umgehen kann..

wenn man weiß was man tut, gibts keine Probleme


----------



## MQue (4. Mai 2007)

ausserdem, mach dann einmal mit UML eine Klassendiagramm aus deinem Programm, das macht überhaupt keinen Sinn, wenn du es so machst, dass du vorher mit UML ein Klassendiagramm machst und dann erst programmierts dann wird sich sicher ergeben, dass nicht alle Methoden statisch sind.


----------



## SlaterB (4. Mai 2007)

oh, ich lese gerade 'fast grundsätzlich das Attribut static'

das sieht natürlich durchaus falsch aus, besonders wenn man dann noch statisch Variablen zur Speicherung Zuständen verwendet,
der Hauptteil eines größeren Programmes sollte wirklich nicht statisch sein, 
sonst muss man sich langsam wundern,

aber mit statischen Operationen geht ja allein schon Vererbung/ Interface nicht,
wenn man sowas nicht verwendet, kanns ja auch kein komplexes Programm sein?


----------



## Tellerrand (4. Mai 2007)

KartoffelKiffer hat gesagt.:
			
		

> Hallo,
> in meinem Methoden verwende ich fast grundsätzlich das Attribut static, so erspare ich mir etwas Schreibaufwand um "nur mal eben diese Methode aufzurufen", ich muss also nicht etxra eine Instanz davon bilden.


Es *immer* zu nutzen macht keinen Sinn.



			
				KartoffelKiffer hat gesagt.:
			
		

> Ein Arbeitskollege meinte nun ich solle das besser lassen und auf das static-Attribut verzichten, es nur im Notfall gebrauchen.


Komplett auf static zu verzichten ist genauso unsinnig.


Static setzt man genau dann, wenn man keine Objekteigenschaft, sondern eine Klasseneigenschaft haben will.

Ich glaube du hast hier die falsche Frage gestellt.
Jeder der weiß was static macht, kann dadurch auch entscheiden wozu es vorhanden ist und wann man es nutzt.


----------



## KartoffelKiffer (4. Mai 2007)

Hallo,



> andererseits hat man oft hunderte Hilfoperationen so wie in der Math-Klasse,
> für diese macht es absolut keine Probleme, diese statisch zu lassen



Genau darum handelt es sich ja. Meistens sind es nur kleine Funktionen, die zB einen String auseinanderpflücken oder ähnliches. Diese Hilfsoperationen lagere ich in Klassen ab, setze deren Attribute auf protected/public und static.

Und schwupps kann ich mit Klasse.Funktion() (oder mit Funktion(), wenn sie in derselben Klasse liegt) den Prozess starten.

Oder ein anderes Beispiel, eine Sicherung von Dateien starten. Ich erstelle ein Package 'Sicherung', welches alle benötigten Klassen dazu beinhaltet. Es gibt eine Hauptklasse, die den Prozess startet, die anderen sind wie erwähnt die Hilfsoperationen. Um aus einer Operation eine andere zu starten (zB das Datum der Sicherung wegschreiben) mache ich davon lediglich eine static-Methode und rufe sie auf. So muss ich nicht extra eine Instanz davon bilden und kann sie wie gewohnt aufrufen.

Weitere Hilfoperationen die das Datum der Sicherung wegschreiben beinhalten evtl wieder eigene Operationen, die in derselben Klasse stehen, diese sind dann wiederrum private static.

So baut sich schnell mal ein großer Pool an Klassen und Methoden auf.



Mfg Tom


----------



## André Uhres (4. Mai 2007)

Michael1234 hat gesagt.:
			
		

> ..static- Methoden können auch keine Objekt- Methoden aufrufen..


Ein weit verbreiteter Irrtum: http://www.java-forum.org/de/viewtopic.php?p=276212#276212


----------



## Tellerrand (4. Mai 2007)

Das hört sich jetzt weniger nach OOP an.
Nutzt du überhaupt öfters mal mehrere Instanzen einer Klasse?


----------



## SlaterB (4. Mai 2007)

@Andre:
was soll denn da der Irrtum sein?

wenn man ein Objekt hat, dann kann JEDER die Operationen aufrufen,
also auch die statische Operation, da ist doch keine Kunst dabei..


----------



## André Uhres (4. Mai 2007)

SlaterB hat gesagt.:
			
		

> ..da ist doch keine Kunst dabei..


Jup, umso erstaunlicher, daß kaum einer drauf kommt  :wink:

```
public class Test3 {
    private String name;
    public Test3( String name ){this.name = name;}
    private static void machWas(Test3 test3){
        System.out.println( "Ich bin der " + test3.name );
    }
    public static void main( String[] args ){
        Test3 test3 = new Test3( "Peter" );
        machWas(test3);
    }
}
```


----------



## Tellerrand (4. Mai 2007)

André Uhres hat gesagt.:
			
		

> SlaterB hat gesagt.:
> 
> 
> 
> ...


Es scheitert an der Formulierung nicht am Verständnis.
Das als Parameter übergebene Objekte behandelt werden können ist so selbstverständlich, dass man dies bei der Formulierung ignoriert.

Man will ja den Unterschied zwischen statischen Funktionen und Instanzmethoden erklären und der Unterschied ist eben der, dass eine Instanzmethode auf die Attribute/Methoden ihrer Instanz Zugriff hat, eine statische aber eben keine Instanz besitzt wodurch sie auch nicht auf diese Instanz zugreifen kann.


----------



## André Uhres (4. Mai 2007)

Tellerrand hat gesagt.:
			
		

> ..eine statische aber eben keine Instanz besitzt..


Das ist schon wieder irreführend. Hängt ganz einfach nur davon ab, ob man ihr eine gibt oder nicht.
Das mein ich ja grad damit, daß kaum einer drauf kommt, obwohl es so selbstverständlich ist.


----------



## Leroy42 (4. Mai 2007)

@André

Wärst du mit der Formulierung



> eine statische Methode aber keiner Instanz _zugeordnet_ ist


statt mit


> eine statische Methode aber eben keine Instanz besitzt.


einverstanden, um deiner Pedanterie(*) zu genügen?   


(*) Nicht bös gemeint. Ich bin gelegentlich selbst ein Pedant.


----------



## André Uhres (4. Mai 2007)

Das ist nicht pedantisch gemeint. Es ist nur eine Tatsache, daß da einfach kaum einer dran denkt, wahrscheinlich weil es so simpel ist. Das hat auch nicht so sehr etwas mit der Formulierung zu tun.


----------



## Tellerrand (4. Mai 2007)

André Uhres hat gesagt.:
			
		

> Tellerrand hat gesagt.:
> 
> 
> 
> ...


Halben Satz zitieren und dann vollkommen fehl interpretieren ist auch eine Kunstform.


----------



## AlArenal (4. Mai 2007)

Ist eben eine von der Muse geküsste Familie


----------



## André Uhres (4. Mai 2007)

Tellerrand hat gesagt.:
			
		

> ..Halben Satz zitieren und dann vollkommen fehl interpretieren ist auch eine Kunstform.



Naja, ich weiss ja was du damit gemeint hast. Darum geht's ja auch gar nicht. 

Der Punkt ist einfach das allgemeine Denkschema: 
Klassenmethode --> kann nicht auf Instanzvariablen und Instanzmethoden arbeiten.

Das ist aber möglich, wenn ihr explizit eine Referenz auf das entsprechende Objekt übergeben wird.
Das wird eben allgemein einfach vergessen oder übersehen.



			
				AlArenal hat gesagt.:
			
		

> Ist eben eine von der Muse geküsste Familie


Danke für das Kompliment


----------



## Tellerrand (4. Mai 2007)

André Uhres hat gesagt.:
			
		

> Der Punkt ist einfach das allgemeine Denkschema:
> Klassenmethode --> kann nicht auf Instanzvariablen und Instanzmethoden arbeiten.


Ich kenne ca 30 Leute die nichtmehr als Anfänger gelten und alle würden diesen Satz in den richtigen Kontext stellen, so das er gültig ist.
Ehrlich gesagt kenn ich nur 1 oder 2 blutige Anfänger bei denen es möglich wäre, dass sie den Satz so deuten wie von dir behauptet.
Das man statischen Methoden auch Parameter übergeben kann ist nunmal mit das erste was man lernt 



			
				André Uhres hat gesagt.:
			
		

> Das ist aber möglich, wenn ihr explizit eine Referenz auf das entsprechende Objekt übergeben wird.


Halt! ... richtig wäre es den Satz noch auf fehlende Kapselung zu spezialisieren. Oder aber auch nur ein bedingt oder so einfügen.
(Wenn schon genau, dann richtig.)


----------



## André Uhres (4. Mai 2007)

Es ist ganz egal, ob Anfänger oder Fortgeschrittener, oder wie man es formuliert.
Es ist einfach so, daß man diese Kleinigkeit oft übersieht. Deshalb wollte darauf hinweisen.


----------



## Jango (4. Mai 2007)

André Uhres hat gesagt.:
			
		

> Es ist ganz egal, ob Anfänger oder Fortgeschrittener, oder wie man es formuliert.
> Es ist einfach so, daß man diese Kleinigkeit oft übersieht. Deshalb wollte darauf hinweisen.



...darüber hinaus täte "Tellerrand " gut dabei, sich mit seiner "versteckte" Feindseligkeit André gegenüber etwas zurücktuhalten. 

@Tellerrand: Vergleiche mal die Anzahl deiner Post's mit der von André...
Und dann frag dich, wer von euch beiden bisher die meiste Hilfe gespendet hat...


----------



## Leroy42 (4. Mai 2007)

Jango hat gesagt.:
			
		

> ...darüber hinaus täte "Tellerrand " gut dabei, sich mit seiner *"versteckte" Feindseligkeit *André



Was bringt dich denn zu dieser Vermutung.  :shock: 



			
				Jango hat gesagt.:
			
		

> @Tellerrand: Vergleiche mal die Anzahl deiner Post's mit der von André...
> Und dann frag dich, wer von euch beiden bisher die meiste Hilfe gespendet hat...



Das erinnert mich irgendwie daran, daß man eBayern, die noch
keine Bewertungen haben, nicht trauen soll.

==> Als Neueinsteiger chancenlos!

Oder wie jetzt?


----------



## Wildcard (4. Mai 2007)

Leroy42 hat gesagt.:
			
		

> Das erinnert mich irgendwie daran, daß man eBayern, die noch
> keine Bewertungen haben, nicht trauen soll.


Ich hab eine ganze Weile gebraucht um zu verstehen das du nicht von elektronischen Bayern redest


----------



## AlArenal (4. Mai 2007)

Die würden ja auch "E-Bayern" geschrieben


----------



## Leroy42 (4. Mai 2007)

Wildcard hat gesagt.:
			
		

> Leroy42 hat gesagt.:
> 
> 
> 
> ...



Elektronische Bayern?  :shock: 

Gibts die denn überhaupt schon Analoge?  ???:L 

Gib mal bei google ein: _"kleines diebisches bergvolk"_  



			
				Ex-Freundin hat gesagt.:
			
		

> _Bayern ist ein schönes Land; da laufen bloß zuviel Bayern rum_





			
				Ich hat gesagt.:
			
		

> _der guckt wie ein Bayer vorm Eiffelturm_



Hinweis:  :meld: 

_Jede Ähnlichkeit mit Angehörigen eines bestimmten
Volksstammes ist *beabsichtigt*!_

(Muß zum Wochenende mal ablästern   )


----------



## André Uhres (4. Mai 2007)

Heisst das, die Bayern haben statische Methoden, und arbeiten damit auf Instanzvariablen?


----------



## Tellerrand (4. Mai 2007)

Aber nur wenn sie public sind 


@Jango: Bitte?
Ich war bisher weder feindselig noch beleidigend.
Oder muss ich hier alles in Watte packen, damit auch keiner auf die Idee kommt es wäre so?
Das diese Diskussion hier etwas off Topic ist mag sein, aber schließe bitte nicht von direkten Postings auf unterschwellige Feindseligkeit.


----------

