Methoden: static vs. instance

Status
Nicht offen für weitere Antworten.

Fireball29

Mitglied
Hi!

Mich würde mal interessieren wann ihr eine Methode static deklariert? Man findet viele Meinungen dazu. Es soll allerdings eine Praxisdiskussion sein, keine Anfängerfrage :) ich programmiere schon jahrelang in Java.

Die Vorgabe ist ja eigentlich ganz klar, nur halten sich viele nicht daran. Deshalb der Hintergrund meiner Frage.

Viele Grüße,
Fireball
 

Marco13

Top Contributor
Methoden macht man static, wenn man sie static machen kann (d.h. so oft wie möglich), und fields macht man static, wenn man sie static machen muss (d.h. so selten wie möglich). Der Rest sind die Entscheidungen, für die Software-Entwickler die dicke Kohle kriegen :cool:
 

Leroy42

Top Contributor
Marco13 hat gesagt.:
Methoden macht man static, wenn man sie static machen kann (d.h. so oft wie möglich)

Da bin ich etwas anderer Meinung!

Methoden sollte man nur dann static machen, wenn sie keine
Relevanz zu einer Klasseninstanz haben, z.B die ganzen
java.lang.Math - Methoden (sqrt(), sin(), ...)

Aber ich gebe zu, das dann der Reiz von Marco13s Beschreibung
flöten ginge. :D
 

Tellerrand

Bekanntes Mitglied
"Methoden sollte man nur dann static machen, wenn sie keine Relevanz zu einer Klasseninstanz haben"
Kann man sie denn nicht erst dann static machen wenn sie keine Relevanz zur Klasseninstanz haben?

"Die Vorgabe ist ja eigentlich ganz klar, nur halten sich viele nicht daran. Deshalb der Hintergrund meiner Frage."
Wer hält sich wo nicht an welche Vorgabe?
 
S

SlaterB

Gast
> Methoden sollte man nur dann static machen, wenn sie keine Relevanz zu einer Klasseninstanz haben

widerspricht sich doch nicht mit

> Methoden macht man static, wenn man sie static machen kann



zusammen: Methoden sollten möglichst keine Relevanz zu einer Klasseninstanz haben

na gut, dass kann man auch negativ auslegen aber ist doch ein berechtiger Anspruch
 

Marco13

Top Contributor
Naja - der Nachsatz hat ja auch seine Bedeutung. Es macht nicht unbedingt Sinn, vollkommen pauschal-brutal zu versuchen, alle Methoden static zu machen (mit "brutal" meine ich, dass man ja theoretisch JEDE Methode static machen könnte, indem man ihr eine Referenz auf ein Objekt der Klasse übergibt, in der sie steht, und auf deren fields sie nicht zugreifen darf, weil sie ja static ist (nicht lachen: In C++ wird das genau so gemacht: Jede Memberfunktion bekommt den "this"-Zeiger implizit übergeben!)). Irgendwo muß doch ein Mensch von Fall zu Fall die Entscheidung treffen.
 

Ark

Top Contributor
Ich handhabe das so:

Man sollte so viele Methoden wie möglich statisch machen. Eine Methode sollte aber nicht statisch sein, sobald sie mindestens eine Instanz ihrer Klasse als Paramter eingegeben bekommen würde. In einem solchen Fall hätte man sich nämlich diesen Paramter sparen und stattdessen einfach this (für diesen Paramter) verwenden können.

Eigenschaften sollten statisch sein, wenn alle Instanzen diese Eigenschaften teilen; ansonsten nicht.

Ark
 

Marco13

Top Contributor
Auch DAS ist (streng genommen) zu pauschal:
Code:
class Mensch
{
    String name;
    int alter;
 
    public void gibAus()
    {
        System.out.println(name+" "+alter);
    }

    public static void gibAus(Mensch mensch)
    {
        System.out.println(mensch.name+" "+mensch.alter);
    }

    public static void gibAus(String name, int alter)
    {
        System.out.println(name+" "+alter);
    }
}
(Nur ein Beispiel, um zu verdeutlichen, dass man kein allgemeingültiges Beispiel angeben kann :wink: )
 

Ark

Top Contributor
@Marco13: Wenn du dich auf meinen Beitrag beziehst, würde ich deinen bitte noch etwas erläutert haben, denn ich sehe auch an deinem Beispiel keinen Grund, warum meine Idee „zu pauschal“ sein soll. ???:L

Ark
 

HLX

Top Contributor
Marco13 hat gesagt.:
Auch DAS ist (streng genommen) zu pauschal:
Code:
class Mensch
{
    String name;
    int alter;
 
    public void gibAus()
    {
        System.out.println(name+" "+alter);
    }

    public static void gibAus(Mensch mensch)
    {
        System.out.println(mensch.name+" "+mensch.alter);
    }

    public static void gibAus(String name, int alter)
    {
        System.out.println(name+" "+alter);
    }
}
(Nur ein Beispiel, um zu verdeutlichen, dass man kein allgemeingültiges Beispiel angeben kann :wink: )

Die static-Methoden sind doch nicht dein Ernst, oder? Das ist ja grausam... :autsch:
 
G

Gast

Gast
staticmethoden sooft wie möglich?? Schon mal was von OOP gehört?
 
S

SlaterB

Gast
> Schon mal was von OOP gehört?

als der Mensch das Rad erfunden hatte, fuhr er nur noch mit dem Auto,
selbst wenn der Weg vom Wohnzimmer in die Küche zu Fuss schneller wäre..
 

Marco13

Top Contributor
Was jetzt die Frage, ob static oder nicht, mit OOP zu tun hat? Natürlich sollte man nicht krampfhaft versuchen, alles möglichst static zu machen, aber wenn eine Methode irgendwas übergeben bekommt, dann unabhängig von irgendwelchen Fields damit rumrechnet, und irgendwas zurückgibt, kann sie doch static sein - un sollte das dann imho auch. Und das Beispiel sollte nur verdeutlichen, dass man zwar irgendwas auf biegen und brechen static machen kann, dass aber nicht tun sollte, wenn es "keinen Sinn ergibt". Und WANN es Sinn ergibt, ist eben die Frage, die man von Fall zu Fall entscheiden muss... (mehr wollt' ich damit ja nicht sagen :roll: )
 

HLX

Top Contributor
Marco13 hat gesagt.:
Was jetzt die Frage, ob static oder nicht, mit OOP zu tun hat? Natürlich sollte man nicht krampfhaft versuchen, alles möglichst static zu machen, aber wenn eine Methode irgendwas übergeben bekommt, dann unabhängig von irgendwelchen Fields damit rumrechnet, und irgendwas zurückgibt, kann sie doch static sein - un sollte das dann imho auch. Und das Beispiel sollte nur verdeutlichen, dass man zwar irgendwas auf biegen und brechen static machen kann, dass aber nicht tun sollte, wenn es "keinen Sinn ergibt". Und WANN es Sinn ergibt, ist eben die Frage, die man von Fall zu Fall entscheiden muss... (mehr wollt' ich damit ja nicht sagen :roll: )

Ok. Ich war mir sicher, dass es eine Homage an static war, wg. einem vorherigen Beitrag, in dem stand: static so oft wie möglich.

Im Sinne der Objektorientierung sollte man schon im Vorfeld zusehen, static nur für tatsächlich klassenbezogene Vorgänge und Utilities zu verwenden und ansonsten so weit wie möglich zu vermeiden, sprich: gut überlegen, ob bestimmte Operationen von einem Objekt ausgeführt werden sollten.
 
C

Christian76

Gast
Static Methoden benutze ich selten. Meistens verwende ich in meinen Programme durch static deklarierte
globale Varialben in einer Controlerklasse. Z.b. sowas hier:

Code:
class controll
{
    public static int Wert;
}
 

mephi

Bekanntes Mitglied
Christian76 hat gesagt.:
Static Methoden benutze ich selten. Meistens verwende ich in meinen Programme durch static deklarierte
globale Varialben in einer Controlerklasse. Z.b. sowas hier:

Code:
class controll
{
    public static int Wert;
}

ähm und der sinn davon ist welcher?
 

Marco13

Top Contributor
mephi hat gesagt.:
ähm und der sinn davon ist welcher?
Vermutlich: Sich das Leben leicht zu machen.
Bis man mal etwas ändern muss. Oder man mal ZWEI Control's braucht. Oder ein Programm mit mehr als 1000 LOC schreiben muss. Oder bis man solchen Code nachvollziehen muß, wenn er von jemand anderem geschrieben wurde.
 
G

Guest

Gast
@ mephi

Wenn ich mehrere Objekte habe, die aber alle auf einen Variable zugreifen. Keine lokale Klassenvariable, sondern eine Globale.
 

Marco13

Top Contributor
Code:
class controll
{
    private int wert;
    public int getWert() { return wert; }
    public void setWert(int w) { wert = w;}
}

class A 
{
    private controll c;
    ...
        c.setWert(5);
}


class B 
{
    private controll c;
    ...
        int w = c.getWert();
}

Aber das ist so viel Tipparbeit :roll:
 
C

Christian76

Gast
ach, naja:

Code:
class A
{
    ...
    controll.i=1;
    ...
}

class B
{
    ...
    controll.i=1;
    ...
}

class controll
{
    public static int i;
}

das geht finde ich!
 

HLX

Top Contributor
Christian76 hat gesagt.:
ach, naja:

Code:
class A
{
    ...
    controll.i=1;
    ...
}

class B
{
    ...
    controll.i=1;
    ...
}

class controll
{
    public static int i;
}

das geht finde ich!

Naja, direkter Zugriff auf Variablen ist eigentlich nicht schön. Was machst du, wenn du, wenn du controll ableiten willst und in der Ableitung z.B. die Variable controll nicht mehr von außen modifizierbar sein soll?
 

Fireball29

Mitglied
So, wunderbar, im Grunde wurde ja schon alles gesagt, zumindest in der Theorie :)

- eine Variable wird static wenn sie logisch nicht zu einer bestimmten Instanz gehört, sondern der Klasse zugeordnet werden kann
- eine Methode wird static wenn sie keine lokalen Variablen benutzt, wobei natürlich die aktuelle Instanz also this gemeint ist

Die Verwendung der Regeln sollte allerdings sinnvoll sein, denn wie schon erwähnt wurde kann man ja immer das aktuelle Objekt (this) an die static Methode übergeben, was wohl fast immer unsinnig ist.

Ich verwende statische Methode sehr gerne um allgemeine Funktionalität, welche zur Klasse gehört und oft gebraucht wird, an der richtigen Stelle abzulegen. Dies dient der Wiederverwendbarkeit und Vermeidung von Redundanz.
Und wie besch... Redundanz ist wissen die meisten von uns sicher aus dem Programmiereralltag

Wenn man das sauber aufbaut und beherrzigt, sucht, findet und erstellt man Methoden eigentlich fast immer an der richtigen Stelle. Und das ist es, was ich vor allem unter objektorientierter Programmierung verstehe, eine logische und strukturierte Menge von Objekten (mit Eigenschaften und Funktionalitäten) mit minimaler Redundanz.

Viele Grüße,
Fireball
 

HLX

Top Contributor
Fireball29 hat gesagt.:
eine Methode wird static wenn sie keine lokalen Variablen benutzt, wobei natürlich die aktuelle Instanz also this gemeint ist

Falsch! Wird durch das Singleton-Pattern widerlegt --> Instanziierung der "lokalen" Variable in der static-Methode. Du meinst wahrscheinlich Objektvariable

Versucht das nicht in irgendwelche Programmier-Regeln zu pressen. In der Objektorientierung sollte man in der Lage sein zwischen Objektfunktionalität und Klassenfunktionalität zu unterscheiden. Fragt euch, was Ihr mit eurer Funktion/Methode erreichen wollt. Handelt es sich um etwas, was das spezifische Objekt können muss oder um ein Unterscheidungsmerkmal zu anderen Objekten oder wird z.B. eine einzelne Factory benötigt etc.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Methoden Static Methoden und Thread??? Allgemeine Java-Themen 4
S static methoden Allgemeine Java-Themen 9
G static- Methoden überschreiben Allgemeine Java-Themen 10
MQue static Methoden/Klassen Allgemeine Java-Themen 7
K Warum static-Methoden nutzen Allgemeine Java-Themen 26
K Überschreiben von 'static'-Methoden hat anderes Verhalten? Allgemeine Java-Themen 2
B Leere vererbte Interface-Methoden Allgemeine Java-Themen 8
R Programm führt Methoden gleichzeitig aus Allgemeine Java-Themen 2
Encera Unterschied zweier "toString"-Methoden Allgemeine Java-Themen 1
torresbig Klasse mit extends Calendar über Methoden ändern (Hirnblockade) Allgemeine Java-Themen 7
Sachinbhatt Sind alle Methoden in Java implizit virtuell Allgemeine Java-Themen 2
B Arrays von Methoden möglich? Allgemeine Java-Themen 44
S Mit Methoden kann man definieren für was <T> steht. Geht das auch irgendwie für Variablen? Allgemeine Java-Themen 12
N abstracte klassen methoden Allgemeine Java-Themen 32
G Methoden für die Zukunft sinnvoll? Allgemeine Java-Themen 4
nonickatall Methoden Kann man Klassen/Methoden aus Variablen heraus aufrufen? Allgemeine Java-Themen 6
LimDul Hä? Lambda-Ausdruck geht, Methoden-Referenz nicht Allgemeine Java-Themen 8
B Methoden Java Getter und Setter Methoden Allgemeine Java-Themen 9
Y Java Methoden unterschiedliche Zahlenreihen Allgemeine Java-Themen 2
S Interface Design von HookUp oder Callback Methoden für eigenes Framework Allgemeine Java-Themen 9
F Sich automatisch aufrufende Java-Methoden Allgemeine Java-Themen 2
J Namen von Methoden über Reguläre Ausdrücke bearbeiten Allgemeine Java-Themen 6
D Methoden Methoden anpassen und fehlende Funktionen hinzufügen Allgemeine Java-Themen 475
V Threads Probleme beim Aufrufen von Methoden einer anderen Klasse (Threads) Allgemeine Java-Themen 14
R Statistische Methoden (Mathematik) Aufgabe Allgemeine Java-Themen 9
X Brüche kürzen mittels Methoden und ggT Allgemeine Java-Themen 15
L Operatoren Java Reflections: Alle Methoden einer Klasse aufrufen ohne Exceptions Allgemeine Java-Themen 5
L mehrere Methoden Allgemeine Java-Themen 19
KeexZDeveoper Zugriff auf Methoden vom Server Allgemeine Java-Themen 7
B StAX Parser - mehrere Methoden, ein XML Allgemeine Java-Themen 4
F Operationen/Methoden einen WebService im Browser mit Apache Axis aufrufen Allgemeine Java-Themen 4
A Automatisches Methoden Laufzeiten logging? Allgemeine Java-Themen 7
M Quellcode von Java-Methoden Allgemeine Java-Themen 9
rentasad Design-Frage - Interfaces, Klassen, statische Methoden Allgemeine Java-Themen 3
N HashMap und Methoden richtig einbinden Allgemeine Java-Themen 2
R Variable durch mehrere Methoden ändern und nutzen Allgemeine Java-Themen 17
Q-bert Methoden Methoden in Java Allgemeine Java-Themen 13
D Methoden Java-Aufgabe Allgemeine Java-Themen 2
M Compiler-Fehler Methoden-Referenz Allgemeine Java-Themen 5
X Threads Externe Variablen in Run Methoden verändern Allgemeine Java-Themen 4
S 2 methoden mit gleichen namen und ein Interface Allgemeine Java-Themen 9
F Enum-werte als Methoden-Parameter übergeben Allgemeine Java-Themen 6
N Vererbung Design-Problem mit vorhandenen, von der Klasse unabhängigen Methoden Allgemeine Java-Themen 12
E OOP Objekte und Methoden Allgemeine Java-Themen 1
K Java ruft Methoden nicht der Reihe nach auf Allgemeine Java-Themen 14
N Methoden Methoden einer Klasse auf Grundlage eines Strings aufrufen Allgemeine Java-Themen 6
T Java Array in Methoden Allgemeine Java-Themen 1
D Code für bereitgestellte Methoden Allgemeine Java-Themen 1
P Entity Objekt Methoden vs Service methoden Allgemeine Java-Themen 2
R Signatur von Methoden in eine Datei schreiben? Allgemeine Java-Themen 4
A Methoden verändern Allgemeine Java-Themen 12
F Methoden Arraylist weiterverwenden nach methoden Aufruf Allgemeine Java-Themen 2
J Best Practice Testen von protected Methoden Allgemeine Java-Themen 7
L Methoden "Schiffe versenken" Quellcode in Methoden umwandeln Allgemeine Java-Themen 6
G Matrix reduzieren zwei Methoden Allgemeine Java-Themen 2
Sogomn Best Practice "Doppelte" Methoden Allgemeine Java-Themen 3
Paul15 String Methoden Allgemeine Java-Themen 7
G Methoden BMI -Wert Aufgabe(Methoden) Allgemeine Java-Themen 4
F Testen von Methoden Allgemeine Java-Themen 3
S "Vererben" statischer Felder/Methoden Allgemeine Java-Themen 4
F Methoden in der Enumeration Klasse Allgemeine Java-Themen 1
S Methoden ohne Methodenkopf ?! Allgemeine Java-Themen 5
T Überschreiben von Methoden Allgemeine Java-Themen 6
M Methoden werden in falscher Reihenfolge bearbeitet Allgemeine Java-Themen 10
S Methoden Methoden überschreiben Allgemeine Java-Themen 3
N Threads statische Methoden in Threads Allgemeine Java-Themen 5
O Java-Obfuscator, welcher einzelne Methoden, Klassen und Ordnerstrukturen ausnehmen kann. Allgemeine Java-Themen 1
A also definition von klassen und string methoden und algorithmik Allgemeine Java-Themen 13
X Eigene Annotation - mit Bedingung für ganze Klassen oder Methoden Allgemeine Java-Themen 2
A Threads Lock über mehrere Abschnitte in verschiedenen Methoden Allgemeine Java-Themen 5
S Methoden Frage Allgemeine Java-Themen 2
R Wie kann man diese Methoden in arrays etablieren? Allgemeine Java-Themen 8
M Methoden in Rescources speichern Allgemeine Java-Themen 4
G Synchronisation nicht statischer Methoden Allgemeine Java-Themen 4
A Vererbung finale Methoden überschreiben Allgemeine Java-Themen 24
A Methoden parallelisieren? Allgemeine Java-Themen 2
L Methoden methoden an generischen klassentyp anpassen Allgemeine Java-Themen 5
C Methoden Übernahme von standart nativen Methoden? Allgemeine Java-Themen 9
B Zusammenfassen verschiedener ähnlicher Methoden Allgemeine Java-Themen 8
K JNI: Methoden aus unterschiedlichen Threads aufrufen Allgemeine Java-Themen 3
P Unterschiedliche Clone- Methoden Allgemeine Java-Themen 5
MQue Spezialfrage Überschreiben von Methoden Allgemeine Java-Themen 14
B Methoden Alle Methoden und Variablen aus Java-Dateien auslesen. Allgemeine Java-Themen 7
MiMa Rekursive Methoden Allgemeine Java-Themen 3
S Programm das alle aufgerufenen Methoden ausgibt..? Allgemeine Java-Themen 6
F ListIterator (next & previous methoden) Allgemeine Java-Themen 5
W Frage zu Refactoring statischer Methoden Allgemeine Java-Themen 4
M Methoden/Klassen für andere Projekte Allgemeine Java-Themen 4
T Methoden per String-Namen aufrufen Allgemeine Java-Themen 2
C Kapselung Warum graift man auf Variablen nur über Methoden und nich direkt zu? Allgemeine Java-Themen 10
A Methoden ohne Referenzen finden Allgemeine Java-Themen 9
turmaline OOP zwei gleiche Methoden mit kleinen Unterschieden Allgemeine Java-Themen 15
G JUnit Test Methoden in anderen Thread verlagern Allgemeine Java-Themen 4
K Auf Methoden der Runnable Klasse zugreifen Allgemeine Java-Themen 2
S Methoden Class.forName() >> Methoden - Reihenfolge Allgemeine Java-Themen 5
D Passende Name für Methoden finden Allgemeine Java-Themen 3
D Wann sollte ich statische Methoden und Variablen benutzen? Allgemeine Java-Themen 44
A Methoden laufen im Konstruktor, außerhalb allerdings nicht Allgemeine Java-Themen 2
M Generische Methoden mit Java und globale Variablen Allgemeine Java-Themen 9
GianaSisters ArrayList in Methoden übergeben Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben