Kurs Java #10 Metody

Java

Loading

Metody, a inaczej funkcje w języku Java są niezbędnym elementem każdego programu, pozwalając na organizowanie kodu oraz realizowanie jego logiki. W tym artykule poznasz definicję, rodzaje i sposób używania metod: od prostych przykładów po nowoczesne podejście programowania funkcyjnego. Idealne podsumowanie dla osób, które zaczynają lub pragną sobie przypomnieć kluczowe konstrukcje Javy. Można powiedzieć, że każdy programista powinien umieć korzystać z metod, aby stworzyć dobrze zaprojektowany system.

Wprowadzenie

Pisząc kod można zauważyć, że kopiowanie i wklejanie tego samego kodu w różnych miejscach jest bezsensu. Kod staje się nieczytelny, trudny w utrzymaniu i podatny na błędy. Aby unikać takich problemów należy stosować „metody”, czyli małe, samodzielne fragmenty kodu, które można wielokrotnie wywoływać w różnych częściach programu. Pozwalają one na uporządkowanie kodu zamykając je w mniejsze logiczne bloki, uniknąć powtarzalności używając tej samej metody wiele razy, poprawić czytelność i tym samym ułatwić zrozumienie kodu. Więc metoda w Javie to wydzielony fragment kodu, który wykonuje określone zadania. W uproszczeniu można powiedzieć, że metoda to taka „maszynka”, do której coś wkładamy (parametry), ona coś robi, żeby na koniec dać nam jakiś wynik.

Jak rozpoczynałem naukę Javy wyobrażałem sobie ekspres do kawy, do którego wrzucam kawę, wodę, mleko (czyli definiujemy parametry), wciskam guzik z rodzajem kawy, którą chcę zrobić (wywołuję metodę) i mam zwróconą gotową kawę (wynik).

Budowa metody

Każda metoda składa się z:

  • modyfikatora zasięgu
  • typu zwracanego (np. int, void)
  • nazwy
  • listy parametrów
  • ciała metody
public int dodaj(int a, int b) {
    return a + b;
}

public – modyfikator zasięgu, metoda jest widoczna dla innych klas

int – typ zwracany

dodaj – nazwa metody

int a, int b – parametry wejściowe

return a + b; – zwrócenie wyniku

return w Javie służy do zakończenia działania metody i opcjonalnego zwrócenia wyniku. Jeśli metoda ma zadeklarowany typ zwracany (np. int, String, boolean) to musi w swoim ciele użyć return do oddania wartości tego typu.

Wywołanie metody

Metodę wywołujemy po nazwie:

dodaj(5,3);

Parametry i argumenty

Parametry są zmienne, które są przyjmowane przez metody. Czyli to, co metoda oczekuje jako dane wejściowe (w powyższym przykładzie a i b to parametry).

Argumenty są to wartości, które przekazujemy do metody podczas jej wywołania (w powyższym przykładzie 5, 3 to argumenty).

Metoda void

W Javie metody mają określony typ zwracany, czyli informację, co oddaje jako wynik (String, int, boolean, obiekt własnej klasy, itp). Jednak nie każda metoda musi coś zwracać wystarczy, że wykonuje dane zadanie. Metody void nie zwracają żadnej wartości, nie mają wyniku.

public void witaj() {
    System.out.println("Cześć!");
}

Metoda drukuje komunikat i kończy działanie.

Do metod void nie można użyć return z wartością, ale można użyć samego return; wtedy następuje po prostu zakończenie działania metody.

public void sprawdzWiek(int wiek) {
    if (wiek < 0) {
        System.out.println("Niepoprawny wiek!");
        return; // koniec działania metody
    }
    System.out.println("Masz " + wiek + " lat.");
}

Metody statyczne, a niestatyczne

W Javie rozróżniamy dwa główne typy metod: statyczne i niestatyczne (instancyjne). Każda z nich pełni inną rolę oraz posiada inny sposób wywoływania.

Metody statyczne

Metody statyczne (static) należą do klasy, a nie do konkretnego obiektu. Wywołujemy ją używając nazwy klasy, bez tworzenia instancji danej klasy.

Wywołanie:

Zastosowanie:

  • obliczenia matematyczne (np. Math.sqrt()),
  • metody pomocnicze i narzędziowe,
  • generowanie wartości (np. UUID.randomUUID()).

Metody niestatyczne

Metody niestatyczne (instancyjne) należą do konkretnej instancji klasy (obiektu). Mogą korzystać zarówno z pól i metod niestatycznych i statycznych.

Wywołanie:

Zastosowanie:

  • gdy metoda korzysta z pól obiektu (np. dane użytkownika),
  • logika biznesowa związana z konkretną instancją,
  • operacje na stanie obiektu (np. konto.wplac(100)).

Przeciążanie metod (Overloading)

Jeśli chcemy, żeby kilka metod wykonywało podobne zadanie, ale przyjmowało różne typy lub liczby parametrów to mówimy o przeciążaniu metod. W Javie możemy to zrobić, definiując kilka metod o tej samej nazwie, ale z inną listą parametrów.

Przykłady:

Wywołanie:

Zasady przeciążania metod

  1. Ta sama nazwa metody – wszystkie przeciążone metody muszą mieć identyczną nazwę.

    public void test() {}
    public void test(int a) {}


  2. Różna lista parametrów (tzw. sygnatura) – metody muszą się różnić sygnaturą, czyli muszą mieć inną liczbę, typ lub kolejność typów parametrów.

    public void pokaz(String tekst) {}
    public void pokaz(int liczba) {}
    public void pokaz(String tekst, int liczba) {}


  3. Niedozwolona zmiana typu zwracanego – nie można przeciążyć metodą, która różni się tylko typem zwracanym.

    public int getWartosc() {return 1; }
    public double getWartosc() {return 1.0; } // to jest błędne


  4. Modyfikator dostępu nie ma znaczenia – metody przeciążone mogą mieć różne modyfikatory (public, private, protected).

  5. Słowo kluczowe static nie wpływa na przeciążenie – nadal liczy się tylko sygnatura. Jeśli jest ona identyczna, to niezależnie od static kompilator zgłosi błąd.

    public static void test(int a) {}
    public void test(int a) {} //błąd - sygnatura jest ta sama


  6. Liczy się różnica w typach parametrów – Java rozróżnia np. int i double.

    public void licz(int a) {}
    public void licz(double a) {}


  7. Kompilator wybiera najlepsze dopasowanie – gdy wywołujesz metodę, Java patrzy na argumenty i wybiera najbardziej pasującą wersję.

    public void pokaz(int a) {System.out.println("int"); }
    public void pokaz(long a) {System.out.println("long"); }

    pokaz(5); //kompilator wybierze "int", bo jest to dokładniejsze dopasowanie

Dobre praktyki w pisaniu metod

Pisząc metody w Javie warto kierować się kilkoma uniwersalnymi zasadami, które poprawiają czytelność, testowalność i utrzymywalność kodu. Kluczowe wytyczne obejmują zarówno sposób definiowania sygnatury, jak i strukturę wnętrza metody.

  1. Nazwy metod
    Nazwa metody powinna w jasny sposób odzwierciedlać jej funkcję, dlatego też najlepiej używać czasowników do tworzenia nazw, np. obliczSume(), pobierzDane(). Nazwy powinny być czytelne, opisowe. Stosuj konwencję nazewnictwa Java: camelCase, gdzie pierwsze słowo zaczyna się małą literą, a każde kolejne słowo zaczyna się wielką literą. Nie używaj spacji, podkreśleń, czy myślników. Unikaj skrótów i skrótowców, chyba że są powszechnie rozpoznawalne.
  2. Jedna metoda = jedna odpowiedzialność
    Metoda powinna realizować dokładnie jedno, dobrze określone zadanie. Powinno się unikać łączenia kilku etapów logiki w jednym fragmencie kodu. Jeśli metoda jest rozbudowana warto rozważyć rozbicie jej na kilka osobnych, pomocniczych metod.
  3. Unikanie nadmiaru parametrów
    Jeśli parametrów jest więcej niż trzy, warto rozważyć użycie obiektu konfiguracyjnego lub wzorca Builder.
  4. Ograniczenie widoczności
    Stosuj najsurowszy możliwy modyfikator dostępu. Jeśli metoda jest używana tylko wewnątrz klasy oznaczamy ją jako private. Dzięki temu interfejs klasy jest zwięzły, a nieużywane elementy przez zewnętrzne moduły są niewidoczne.
  5. Zwracaj wartości zamiast efektów ubocznych
    Jeśli to możliwe metody powinny zwracać wynik obliczeń zamiast modyfikować stan zewnętrzny, czy wypisywać tylko wynik. Metody w których wyjście zależy wyłącznie od argumentów są łatwiejsze do przetestowania i bardziej przewidywalne.
  6. Obszerność i złożoność
    Metody powinny być krótkie, a dłuższe fragmenty, czy skomplikowaną logikę warto podzielić na mniejsze, pomocnicze metody o jednoznacznych zadaniach.
  7. Obsługa wyjątków i walidacja
    Wewnątrz metody sprawdzaj poprawność otrzymanych parametrów i rzuć odpowiedni wyjątek, gdy dane wejściowe są niepoprawne (np. IllegalArgumentException). Warto również dokumentować w JavaDoc, jakie wyjątki mogą zostać zgłoszone, co ułatwia korzystanie i debugowanie.
  8. Unikanie powtarzalności
    Jeżeli w różnych miejscach klasy lub projektu powtarza się ten sam fragment, powinno się go wydzielić do metody pomocniczej. Dzięki temu redukuje się ilość duplikatów i centralizuje logikę, co ułatwia wprowadzanie potencjalnych zmian.
  9. Testowalność
    Projektuj metody tak, aby można było je łatwo przetestować jednostkowo. Ogranicz zależności od stanu zewnętrznego (np. systemowych zasobów czy statycznych pól). Jeśli metoda potrzebuje zewnętrznego serwisu, rozważ wstrzykiwanie go przez parametr lub konstruktor.

Podsumowanie

Metody w Javie to fundament, a bez nich każdy program szybko zamieniłby się w chaotyczne i powtarzalne linijki kodu. Dzięki nim możemy porządkować logikę, unikać duplikacji i sprawić, że kod będzie bardziej czytelny, modularny i łatwy w rozwoju. W tym artykule poznaliśmy podstawowe elementy metod: od ich budowy, przez parametry, po przeciążenie i dobre praktyki.
Jeśli dopiero zaczynasz i nie jest to dla Ciebie łatwe, nie czujesz się jeszcze pewnie – nie martw się. Wiele rzeczy staje się jasne dopiero w praktyce. W kolejnych artykułach będziemy zagłębiać się w szczegóły, dodawać przykłady i rozjaśniać inne tematy. Z czasem wszystko zacznie układać się w logiczną całość, a same metody zaczną być naturalnym i nieodłącznym elementem kodu.

O autorze

Adam Mingielewicz

Tester oprogramowania z pasją do jakości i technologii. Łączy doświadczenie w testach manualnych i automatycznych, koncentrując się przede wszystkim na aplikacjach webowych oraz usługach SOAP i REST. Testowanie to dla niego nie tylko szukanie błędów, ale przede wszystkim kwestionowanie przyjętych założeń i usprawnianie tego, co nie działa – również w samym procesie testowym. Lubi zmieniać, angażować się i aktywnie budować proces testowy, tak by miał sens, a nie tylko formę. Prywatnie fan rocka, biwakowania, podróży.