przeciążanie funkcji

0

mam takie 2 funkcje:

 void Blad(IOException tresc){
	int i;
	System.out.print("\n");
	for(i=0; i<60; i++)System.out.print("*");
	System.out.print("\n\t"+tresc+"\n");
	for(i=0; i<60; i++)System.out.print("*");
	System.out.print("\n");
    }
    void Blad(String tresc){
	int i;
	System.out.print("\n");
	for(i=0; i<60; i++)System.out.print("*");
	System.out.print("\n\t"+tresc+"\n");
	for(i=0; i<60; i++)System.out.print("*");
	System.out.print("\n");
    }

jak widać, nie różnią się niczym oprócz typu argumentu. I w związku z tym mam pytanie. Czy można zapisać to jakoś w jednej funkcji?

0

Nie mozesz po prostu przekazywac parametru typu Object?

0

W przyapdku metody z IOException linijka:
System.out.print("\n\t"+tresc+"\n");
tak czy tak wola tresc.toString(), wiec mozesz np tak:

void Blad(IOException tresc){
       Blad(tresc.toString());
    }
    void Blad(String tresc){
        int i;
        System.out.print("\n");
        for(i=0; i<60; i++)System.out.print("*");
        System.out.print("\n\t"+tresc+"\n");
        for(i=0; i<60; i++)System.out.print("*");
        System.out.print("\n");
    }
0

Blad
Dd kiedy to nazwy metod piszemy z dużej litery?

0

Niech se pisze jak mu sie podoba, co to kogo interesuje. A co, nie wolno? Nie zadziala?

0
Keraj napisał(a)

Blad
Dd kiedy to nazwy metod piszemy z dużej litery?

Javy uczę się od niedawna, a w c++ było to zalecane(przynajmniej w książkach z których się uczyłem), nawet nie wiedziałem że tak się nie powinno. Rozwiązanie z Object jest chyba najlepsze. Dzięki

0

A co jest złego w pomyśle @Szczawika?

    void Blad(Object ob)
    {
        int i;
        System.out.print("\n");
        for(i=0; i<60; i++)System.out.print("*");
        System.out.print("\n\t"+ob+"\n");
        for(i=0; i<60; i++)System.out.print("*");
        System.out.print("\n");
    }
0

przecież napisałem że

Rozwiązanie z Object jest chyba najlepsze.

0

Wiem, ale zacząłem pisać kiedy Twojego postu jeszcze nie było.

0

Ja bym sie klocil ze rozwiazanei Szczawika to nie to samo o co pytla autor. Teraz np moze wywolac metode Blad z parametrem Integer, 17, java.util.LinkedList itp. Moje rozwiazanie pozwala tylko wywolac ze stringiem lub exc. Oczywiscie mozna recznie wywolac Blad(list.toString()), ale wtedy zakladam ze piszacy wie co robi.
Jest to dosc prosta sprawa w tym przypadk, chodzi o komuniat bledu, ale mozna mnozyc przypadki w ktorych napisanie tak ogolnej metody ktora bierze Object nie byloby najlepszym rozwiazanem, dosc podatnym na bledy. No bo przeciez jak sie zrobi metode z parametrem Object to sie calkowicie traci kontrole nad typami.
Ale to i tak kwestia gustu.

0

Inaczej, Szczawik odpowiedzial na pytanie jak to zmiescic w 1 metodzie (szacun), ale autor pytal o rzecz ktora moze okazac sie zdradliwa.

0

Zgadzam się, że pisanie funkcji zależnych od argumentu typu Object jest trochę ryzykowne. Ale z drugiej strony, pisanie wyspecjalizowanej funkcji do wypisywania komunikatów o wyjatkach typu IOException jest co najmniej dziwaczne.

0

Dlatego napisalem ze ten przyklad jest w miare latwy, ale jest mnostwo takich ktore moga byc niebezpieczne. Jako ze autor postu jest widac w miare swiezak, mozna napomknac o takim potencjalnym problemie.
Pozdro.

0

a co może być niebezpieczne w używaniu object? to że jako argument można podać zmienną której nie da się wyświetlić?

0

Takiej zmiennej nie ma, w klasie Object jest metoda toString() i wszystkie klasy dziedziczą (pośrednio) z klasy Object.

0

więc z czym wiąże się niebezpieczeństwo używania tej metody?

0

No np zalozmy ze robisz okienko z komunikatem dla uzytkownika, super waznym komunikatem. W okienku wypisujesz elementy list lub map lub wyjatkow. Np okienko bedzie dawac notowania jakies na biezaco, cokolwiek co ci sie wydaje wazne.
Robisz metode ktora bazuje na metodzie toString() przekazanych parametrow, tak jak to zrobiles. I teraz gdzies w kodzie powinienes wywolac metoda ktora pokazuje okienko z parametrem: albo lista, albo mapa, albo wyjatek.
Za 2 miesiace przychodzi nowy pracownik, widzi metoda ktora bierze Object, i dodaje taki kod ze okienko wywoluje z parametrem typu int, np 17, i wyswietla takie okienko. Kompiluje sie? Oczywiscie.
Testerzy nie sprawdzili bo costa, uzytkownik dostaje nowa wersje, i w niektorych sytuacjach zamiast super waznych informacji dostaje jakies smieci, np liczbe 17, bo programista myslal ze moze do okienka wyslac cokolwiek. No i jest dosc powazny blad, firma maklerska stracila miliardy.
Teraz pomysl ze masz specalizowane metody ktore pobieraja parametry typu java.util.List, java.util.Map lub java.lang.Throbable / Exception, i wewnetrznie tworza stringa i przekazuja go do wspolnej (prywatnej / protected( metody ktora ma wspolny kod. Zaden nowy programista korzystajac z takiej klasy nie wyswietli okienka ze zlym parametrem.
To taka czysto hipotetyczna sytuacja, ale mozliwa, a napisalem o tym dlatego ze sam niedawno mialem taka sytuacje ze niemalze wszystkie metody z API ktore mi dostarczona braly Object, a pozniej sypaly wyjatkami (pol biedy), albo sprawialy wrazenie ze wszystko (pozornie) jest ok.

0

no tak, faktycznie, może z tego wyniknąć poważny problem. Ale do celów czysto prywatnych ta opcja jest dla mnie najlepsza. Dziękuje za zainteresowanie:)

0

Można tak (zwracam uwagę na private/public!):
Tylko dlaczego wymyślać coś, co już zostało zrobione. Zobacz log4j http://logging.apache.org/log4j/1.2/index.html ?

private void bladImpl(Object tresc){
        PrintStream out = System.out;
        out.println(); // uzywa System.getProperty("line.separator") 
        for(int i=0; i<60; i++) out.print("*");
        out.println();
        out.println("\t"+String.valueOf(tresc));
        for(int i=0; i<60; i++) out.print("*");
        out.println();
}

public void blad(IOException tresc){
        bladImpl(tresc);
    }

public void blad(String tresc){
        bladImpl(tresc);
    }
0

@_krzysiek zrobiles dokladnie to o czym napisalem. Co do log4j, to przyklad ktory podalem jest tylko teoretyczny, mozna wymyslac bez ograniczen przyklady gdzie taka metoda z object jest niebezpieczna.

0
pikseloza napisał(a)

Niech se pisze jak mu sie podoba, co to kogo interesuje. A co, nie wolno? Nie zadziala?
Z tego samego powodu, dla którego pisząc po polsku, zacznamy zdanie wielką literą, resztę wyrazów małą(z wyjątkami - nazwy własne) i kończymy kropką - żeby było czytelne. Czytanie później kodu, który ma tu metody z duże, tam z małej (na pewno będzie wykorzystywał standardową bibliotekę Javy, więc będzie używał metod obiektów, gdzie są one nazwane z małej), jest porównywalne do czytania postów na forum, gdzie użytkownik zaczyna zdanie z małej i ni stąd ni zowąd losowe wyrazy w środku zdania zaczyna pisać z dużej. Za fajnie się czegoś takiego nie czyta...

0

Upieram sie ze pisanie nazw funkcji z malej litery to umowna zasada, moze oni pisza w pracy / w szkole z wilekiej, bo wczesniej pisali w C# i tak sie przyzwyczaili i latwiej im czytac? Nie generalizowalbym tak, to ze (niemal) kazdy javowiec tak pisze to nie znaczy ze to jedyna sluszna konwencja.

1 użytkowników online, w tym zalogowanych: 0, gości: 1