Gibt es in java Default-Parameter?



  • Frage oben



  • Nein.



  • Warum nicht? Das ist doch voll scheiße, auf deutsch gesagt.



  • ehuehwu schrieb:

    Warum nicht? Das ist doch voll scheiße, auf deutsch gesagt.

    Ja reden wir hier über Java oder nicht?
    Wenn du in Java den gleichen Komfort wie in C++ haben möchtest, ist der übliche Weg ganz viele überschriebene Funktionen zu erstellen, die alle fast das gleiche machen, aber unterschiedlich viele Parameter übernehmen.



  • Das ist aber voll umständlich! Warum müssen die Java-Fuzzis immer alles unnötig beschneiden?



  • Troll ⚠



  • ehuehwu schrieb:

    Das ist aber voll umständlich! Warum müssen die Java-Fuzzis immer alles unnötig beschneiden?

    Ist nicht nur Java das so beschneidet, auch in C# gibts keine Defaultparameter.
    Gehende Meinung ist im Moment wohl, dass Defaultparameter den Programmierer nur verwirren.. Ahja?
    Was sagen CengizS und co dazu?



  • Headhunter schrieb:

    Gehende Meinung ist im Moment wohl, dass Defaultparameter den Programmierer nur verwirren.. Ahja?
    Was sagen CengizS und co dazu?

    Das Thema ist flame-verdächtig, aber ich sag trotzdem mal unaufgefordert was dazu. In Java/C# verhält es sich mit dem Überladen von Methoden anders als in C++. Zwei Methoden mit unterschiedlicher Signatur gelten in C++ nicht als überladen, wenn eine in der Basisklasse und eine in der abgeleiteten Klasse definiert ist. Auf HumeSikkins Seite kann man dazu folgendes Beispiel finden:

    #include <iostream>
    class Base
    {
        public:
            void Func(int Param)
            {
                std::cout << "Func in Base: " << Param << std::endl;
            }
    };
    
    class Derived : public Base
    {
        public:
            void Func(double Param)
            {
                std::cout << "Func in Derived:" << Param << std::endl;
            }
    };
    
    int main()
    {
        Derived d;
        d.Func(10);        // Derived::Func !!
        d.Func(12.4);      // Derived::Func
        return 0;
    }
    

    In Java würde einmal die Funktion der Basisklasse aufgerufen werden, in C++ nicht.

    Kurz: Das System beim Overloading ist einfach völlig anders. Default-Parameter passen in das C++ System gut rein, in das von Java nicht. Nehmt mal folgendes Beispiel:

    class Base {
        void foo(int i = 2);    // default-Parameter seien erlaubt
    }
    
    ...
    new Derived().foo()        // ruft Base.foo(int) auf
    

    Wenn jetzt die abgeleitete Klasse foo() nochmal ohne Parameter überlädt, also ein neues foo() zu den Overloads hinzufügt, würde der Aufruf jetzt was anderes bewirken! Das ist dermaßen katastrophal, wenn der Aufrufer die Klassen nicht selber schreibt, dass man es bleiben lässt. In C++ gäbe es dieses Problem nicht, wie man am Beispiel oben sehen kann. Ob das aber wirklich intuitiver ist, darüber kann man sicher auch geteilter Meinung sein. 😉



  • Hallo Optimizer,

    das Problem was du schilderst, betrifft meinem Javaverständnis nach, doch nicht nur Funktionen mit Defaultparametern, sondern ganz allgemein jedwede virtuelle Funktion, oder nicht?



  • ehuehwu schrieb:

    Das ist aber voll umständlich! Warum müssen die Java-Fuzzis immer alles unnötig beschneiden?

    Wieso ist das umständlich? Wenn Du unbedingt auf Default-Parameter angewiesen bist, weil es mehr als 2 oder 3 sind, dann sollte man sowieso das gesamte Design überdenken.

    public void foo(int a){
      foo(a, 0);
    }
    
    public void foo(int a, int b){
      foo(a, b, 0);
    }
    
    public void foo(int a, int b, int c){
    }
    

    Jede Sprache hat andere Features. Wenn Du Java nicht magst, lass es doch einfach bleiben. Ich kenne nur ein Feature was Java fehlen könnte und das ist die Kontrolle über Zeiger und Referenzen. Aber dann wäre Java nicht mehr Java und hätte wohl auch nicht den Erfolg.

    <ironie>Warum hat C++ kein Reflection? Das die immer alles so beschneiden.</ironie>



  • gähn schrieb:

    ehuehwu schrieb:

    Das ist aber voll umständlich! Warum müssen die Java-Fuzzis immer alles unnötig beschneiden?

    Wieso ist das umständlich? Wenn Du unbedingt auf Default-Parameter angewiesen bist, weil es mehr als 2 oder 3 sind, dann sollte man sowieso das gesamte Design überdenken.

    Warum?



  • Headhunter schrieb:

    Hallo Optimizer,

    das Problem was du schilderst, betrifft meinem Javaverständnis nach, doch nicht nur Funktionen mit Defaultparametern, sondern ganz allgemein jedwede virtuelle Funktion, oder nicht?

    Hmmmm nein, dazu muss die Funktion eigentlich nicht virtuell sein. Das Problem hier ist überladen, nicht überschreiben. Das "scoping" ist in Java anders und würde hier Ärger machen.



  • gän2 schrieb:

    gähn schrieb:

    ehuehwu schrieb:

    Das ist aber voll umständlich! Warum müssen die Java-Fuzzis immer alles unnötig beschneiden?

    Wieso ist das umständlich? Wenn Du unbedingt auf Default-Parameter angewiesen bist, weil es mehr als 2 oder 3 sind, dann sollte man sowieso das gesamte Design überdenken.

    Warum?

    Wenn man Klassen mit viele Methoden mit vielen Parametern hat, die man eigentlich nicht immer braucht, klingt das sehr nach eierlegenden Wollmilchsäuen. Klassen und Methoden sollten nach dem Minimalprinzip entworfen werden. Zudem ergeben in manchen Fällen viele Parameter zusammen eine sinnvolle Struktur. Dann kann man wiederum ein Objekt übergeben.



  • gähn schrieb:

    gän2 schrieb:

    gähn schrieb:

    ehuehwu schrieb:

    Das ist aber voll umständlich! Warum müssen die Java-Fuzzis immer alles unnötig beschneiden?

    Wieso ist das umständlich? Wenn Du unbedingt auf Default-Parameter angewiesen bist, weil es mehr als 2 oder 3 sind, dann sollte man sowieso das gesamte Design überdenken.

    Warum?

    Wenn man Klassen mit viele Methoden mit vielen Parametern hat, die man eigentlich nicht immer braucht, klingt das sehr nach eierlegenden Wollmilchsäuen. Klassen und Methoden sollten nach dem Minimalprinzip entworfen werden. Zudem ergeben in manchen Fällen viele Parameter zusammen eine sinnvolle Struktur. Dann kann man wiederum ein Objekt übergeben.

    Na toll, ich les immer "sollten", "in manchen Fällen". Manchmal kann es aber anders viel sinnvoller sein. Warum lassen mir die Java-Entwickler nicht die Freiheit, meine Mittel zu wählen?



  • gän2 schrieb:

    Warum lassen mir die Java-Entwickler nicht die Freiheit, meine Mittel zu wählen?

    Weil viele einfach nicht wissen was sie tun 😉

    In C++/C hat man auch freie Hand bei der Speicherverwaltung und das geht oft genug schief.



  • gän2 schrieb:

    Warum lassen mir die Java-Entwickler nicht die Freiheit, meine Mittel zu wählen?

    Weil du für sowas C++ nimmst. Java ist schön primitiv, aber das aus einem bestimmten Grud, es ist eben eine andere Programmiersprache, nicht nur C++ kastriert.
    Ob das eine Gute Sache ist, oder ob die zahlreichen Features von C++ zu gefährlich sind ist wieder was komplett anderes, Java hat imo sehr wohl seine Daseinsberechtigung.



  • Headhunter schrieb:

    Wenn du in Java den gleichen Komfort wie in C++ haben möchtest

    ROFLMAO 😃

    Ersetze "Komfort" mit Umfang, Möglichkeiten, Mächtigkeit und ich lach' nicht mehr... 👍


Anmelden zum Antworten