static oder nicht?



  • Guten Abend,
    ich hätte bezüglich des static Attributs ein paar Fragen.
    Hierzu 2 Beispiele...

    1. Beispiel:

    public class Main{
    
     public static void main(String[] args){
    
     a();
     b();
     c();
    
    }
    
     public static void a(){ System.out.print( "Hallo " );}
     public static void b(){ System.out.print( "wie geht es " ); }
     public static void c(){ System.out.println( "dir?" ); }
    
    }
    

    2. Beispiel:

    public class Main{
    
     public static void main(String[] args){
    
         Main obj = new Main();
    
     obj.a();
     obj.b();
     obj.c();
    
    }
    
     public void a(){ System.out.print( "Hallo " );}
     public void b(){ System.out.print( "wie geht es " ); }
     public void c(){ System.out.println( "dir?" ); }
    
    }
    
    1. Welche Vor- und Nachteile bringt Beispiel 1 gegenüber Beispiel 2
      mit sich?

    2. Wann ist es ratsam mit static Methoden zu arbeiten?


  • Mod

    Sei vorsichtig mit static Methoden. Wenn Du die zu ausgiebig nutzt, dann landest Du ganz schnell bei einem prozeduralen Programmierstil. Das kann bei kleinen Programmen sinnvoll sein, aber in größeren Programmen solltest Du eher wenige static-Methoden haben.

    Letztendlich ist das eine Frage der Sichtweise. Wenn Du eine objektorientierte Sicht auf Deine Problemstellung hast, dann werden sich aus dieser Vorstellung alleine schon nicht sehr viele static-Methoden ergeben.

    Insofern kann man die Frage nicht wirklich eindeutig in ein paar Sätzen beantworten. Wenn man Deine Frage weiterdenkt, dann fragst Du nach dem Vor- und Nachteilen objektorientierter Programmierung gegenüber prozeduraler Programmierung. Beide Programmierparadigmen haben ihre Stärken und Schwächen. Dabei geht es vor allem darum, wie ein Code mit wachsender Größe wartbar bleibt. Hier ist objektorientierter Code im Vorteil.

    EDIT: Für den Anfang würde ich Dir empfehlen, so weit es geht auf static zu verzichten.



  • aus meiner sicht macht static einen tollen job in der Math class
    bzgl. der wartbarkeit behaupte ich... das mit dieser lösung mehr übersicht ermöglicht wird
    ebenso ist das singleton pattern auf static angewiesen

    wie schon erwähnt es ist schwierige zu beantworten
    aber darauf verzichten? -nein
    ich denke nur wenn man es benutzt lernt man die vorteile und nachteile


  • Mod

    golden_jubilee schrieb:

    ich denke nur wenn man es benutzt lernt man die vorteile und nachteile

    static ist etwas sehr kritisches. Wenn einem nicht klar ist, wann man static benutzen sollte, dann ist das keine Frage, ob man ein bestimmtes Sprachmittel schon gut genug verstanden hat. Wenn man sich diese Frage stellt, dann heißt das, dass man keine objektorientierte Sichtweise auf seine Problemstellung hat. Vermutlich denkt man dann insgesamt noch nicht objektorientiert. Und deshalb sollte man sich in dem Fall mit Objektorientierung auseinandersetzen. Und dann ist es gut, sich zu objektorientierter Programmierung zu zwingen.

    Der Threadersteller fragt, welche Vorteile static hat. Damit drückt er praktisch aus, dass er davon ausgeht, dass static etwas wesentliches zur Sprache hinzufügt. Das Gegenteil ist der Fall: Ohne static schreibt man den mächtigeren Code. Und deshalb sollte die Frage eher sein, was man ohne static an mächtigen Konstrukten programmieren kann.

    Klar, es gibt Stellen, an denen static sinnvoll eingesetzt wird. die Math-Klasse ist so ein Fall und Singletons hattest Du auch erwähnt. Wenn Du ein großes Programm schreibst, dann sind das allerdings erstaunlich wenig Stellen.



  • Vielen Dank für eure Erklärungen 🙂

    wenn ich z.B. den folgenden code hätte...

    code1:

    public class Main{
    
     public static void main(String[] args){
    
     a();
    
    }
    
     public static void a(){ System.out.print( "Hallo " );}
    
    }
    

    wäre es hier sinvoller static zu verwenden oder sollte man doch lieber
    ein extra Objekt, der klasse Main, anlegen um damit die Funktion a() aufzurufen?

    code2:

    public class Main{
    
     public static void main(String[] args){
    
         Main obj = new Main();
    
     obj.a();
    
    }
     public void a(){ System.out.print( "Hallo " );}
    
    }
    


  • hmmmm schrieb:

    Vielen Dank für eure Erklärungen 🙂

    wenn ich z.B. den folgenden code hätte...

    code1:

    public class Main{
    
     public static void main(String[] args){
    
     a();
    
    }
    
     public static void a(){ System.out.print( "Hallo " );}
    
    }
    

    wäre es hier sinvoller static zu verwenden oder sollte man doch lieber
    ein extra Objekt, der klasse Main, anlegen um damit die Funktion a() aufzurufen?

    code2:

    public class Main{
    
     public static void main(String[] args){
    
         Main obj = new Main();
    
     obj.a();
    
    }
     public void a(){ System.out.print( "Hallo " );}
    
    }
    

    leider ist das ein extrem sinnfreies beispiel...
    hier gibt es für beide seiten gute argumente



  • Dann sein doch bitte so freundlich und nenne
    mir ein paar gute Argumente für beide Seiten 🙂



  • hmmmm schrieb:

    Dann sein doch bitte so freundlich und nenne
    mir ein paar gute Argumente für beide Seiten 🙂

    und die methode aufzurufen benötigst du eigentlich kein objekt in main solange du static benutzt, dass ist natürlich bequem, gleichzeitig benutz die methode keine member der klasse und kann demzufolge bei mehreren objekten von Main kein ungewolltes verhalten verursachen

    aber es geht nicht um bequemlichkeit... du wendest dich vom konzept ab, da es außer der erwähnten bequemlichkeit keinen vorteil gibt
    wenn du jetzt noch die funktionen b() und c() hinzufügst, die sich wenn es geht noch member teilen, dann benötigst du auch keine klasse mehr



  • @hmmmm
    Es ist nicht möglich die Vor- und Nachteile von static bei diesem Minimalbeispiel aufzuzeigen. Das Stückchen Code zeigt eigentlich nur die Syntax von static <-> non-static, mehr nicht.

    Ich bin sowieso der Meinung, dass man bei static ein paar mal auf die Schnauze fliegen muss bis man es verinnerlicht hat. Es ist ungeheuer verlockend. Meist geht es aber schief weil Erweiterungen erschwert werden.

    Spiel einfach damit rum bis Du ein Gefühl dafür kriegst.



  • Meiner Meinung nach:
    Utils-> static machen (Utils.paintBox(Graphics g, Rectangle pos) etc...)
    Singletons -> sind meistens auch als static schöner lesbar als mit getInstance() dauernd rumzuhampeln
    Konstanten -> eh static
    Schnittstellen -> ein MailSystem.sendMail("xxx") ist auch immer recht... nett zu benutzen statt Verwendung irgendwelcher irgendwo gespeicherten Instanzen, wobei das dann langsam gefährlich wird

    Aber in mini-Programmen kommt das alles nicht zum tragen wie hier schon gesagt wurde, meist ist exzessives static benutzen da übersichtlicher und besser lesbar weil weniger Ballast... zum lernen solltest du das aber nicht machen.



  • dreaddy schrieb:

    Meiner Meinung nach:
    Utils-> static machen (Utils.paintBox(Graphics g, Rectangle pos) etc...)
    Singletons -> sind meistens auch als static schöner lesbar als mit getInstance() dauernd rumzuhampeln
    Konstanten -> eh static
    Schnittstellen -> ein MailSystem.sendMail("xxx") ist auch immer recht... nett zu benutzen statt Verwendung irgendwelcher irgendwo gespeicherten Instanzen, wobei das dann langsam gefährlich wird

    Aber in mini-Programmen kommt das alles nicht zum tragen wie hier schon gesagt wurde, meist ist exzessives static benutzen da übersichtlicher und besser lesbar weil weniger Ballast... zum lernen solltest du das aber nicht machen.

    1. getInstance ist static? was ist da mit static schöner lesbar?
    2. konstanten sollte man seit 5 mit enums realisieren



  • Meinte eher, eine reine static Klasse ist in der Verwendung angenehmer als ein Singleton und erfüllt meist den gleichen Zweck.


Log in to reply