Metody umożliwiają wykonywanie różnych zadań, na przykład ustawianie i przetwarzanie danych, czy też ich odczytywanie lub zapisywanie. W bieżącym rozdziale przyjrzymy się bliżej możliwościom
jakie udostępniają metody w Javie. Wróćmy do schematu przedstawionego w rozdziale
Klasy i programowanie obiektowe:
<modyfikator dostępu> <typ zwracanej wartości> <nazwa metody> (<lista parametrów>) {
// Instrukcje wykonywane przez metodę
}
Dla uproszczenia pominiemy kwestię modyfikatora dostępu, o którym będziemy pisać w specjalnym, dedykowanym rozdziale.
Tak naprawdę modyfikator jest opcjonalny i choć w praktyce prawie zawsze jest używany, to tak naprawdę jego nieobecność nie wpływa na logikę działania metody.
Będziemy więc operować na schemacie:
<typ zwracanej wartości> <nazwa metody> (<lista parametrów>) {
// Instrukcje wykonywane przez metodę
}
Co rozumiemy przez algorytm?
W celu łatwiejszego przyswojenia wiedzy w tym rozdziale warto jeszcze wytłumaczyć pojęcia takie jak: "algorytm" lub "algorytm przetwarzania danych", którego używamy kilkukrotnie
w dalszej części rozdziału. Co zatem możemy nazwać algorytmem przetwarzającym dane? Będą to na przykład następujące operacje:
-
proste obliczenia matematyczne
-
pobieranie danych i wykonywanie różnych instrukcji na tych danych
-
grupowanie danych (rozdzielenie większej porcji danych na mniejsze porcje, przechowywane w różnych typach obiektów)
-
filtrowanie danych i wyszukiwanie danych na podstawie zadanych kryteriów
...a także wiele, wiele innych...ogranicza nas jedynie wyobraźnia oraz wymagania stawiane przez innych (nauczycieli, klientów, pracodawców, biznes itp.).
Wróćmy teraz do głównego wątku i zobaczmy jak dzielimy metody pod kątem ich przeznaczenia.
Metoda bez parametrów i bez wartości zwracanej
W takim przypadku
typ zwracanej wartości określamy jako
void.
Operujemy na danych przechowywanych w polach obiektu, albo uruchamiamy
inne metody tego obiektu, albo metody
innych obiektów dostępnych z poziomu metody.
W powyższym przykładzie pobieramy w ten sposób nazwę kategorii z obiektu kategorii, przekazanego do pola
category za pomocą konstruktora.
Uwaga. Każdy kolejny opisywany rodzaj metod będzie mógł oczywiście korzystać z:
-
danych przechowywanych w polach klasy
-
metod znajdujących się w tej klasie
-
metod innych obiektów, które są przechowywane w polach tej klasy
Nie będziemy jednak tego pisać w każdym paragrafie, aby nie zamazywać czytelności tłumaczeń.
Będziemy wstawiać jedynie wyjaśnienia charakterystyczne dla danego rodzaju metody.
Kolory: szary i pomarańczowy odpowiadają kolorom użytym w szablonach z początku rozdziału.
Metoda bez parametrów ale z wartością zwracaną
W takim przypadku
typ zwracanej wartości określamy zgodnie z typem obiektu zwracanego przez metodę.
Na przykład możemy zdefiniować metodę, która stworzy obiekt klasy
Item i zwróci go do miejsca w kodzie, w którym została wywołana:
Zwrócony obiekt przypisujemy do obiektu o tym samym typie:
W ten sposób obiekt
item, który został stworzony w klasie
ItemService jest automatycznie gotowy do użytku w miejscu wywołania (w metodzie
main).
Metoda bez parametrów ale z wartością zwracaną (pobierająca)
W takim przypadku
typ zwracanej wartości ponownie określamy zgodnie z typem obiektu zwracanego przez metodę.
Na przykład możemy stworzyć metodę, która pobierze obiekt klasy
Category przechowywany w polu i zwróci go do miejsca w kodzie, w którym została wywołana.
Taki zwrócony obiekt również przypisujemy do zmiennej obiektowej o tym samym typie:
Różnica w stosunku do poprzednio opisywanego rodzaju metody (z wartością zwracaną) polega na tym, że odpowiedzialność bieżącej metody ogranicza się do pobierania konkretnej wartości.
Tego typu metoda jest określana jako
metoda pobierająca (
getter).
Metoda z parametrami ale bez wartości zwracanej
W takim przypadku
typ zwracanej wartości określamy jako
void, a parametr (albo parametry) określamy podając typ wartości oraz nazwę parametru.
Na przykład możemy stworzyć metodę, która przyjmie jako parametr obiekt klasy
Item. Ten rodzaj metody można wykorzystać do uruchomienia
jakiegoś rozbudowanego algorytmu, ale my dla uproszczenia pokażemy przykład prostego pobrania nazwy z obiektu i wydrukowania jej na konsoli.
Tutaj nie ma żadnej zwróconej wartości, więc niczego nie przypiszemy po wykonaniu tej metody:
Uruchamiamy jedynie pewien proces, który ma wykonać przetwarzanie danych. Taką metodę nazywamy
metodą przetwarzającą.
Metoda z parametrami ale bez wartości zwracanej (ustawiająca)
W takim przypadku ponownie
typ zwracanej wartości określamy także jako
void, a parametr (albo parametry) określamy podając typ wartości oraz nazwę parametru.
Ten rodzaj metody, mimo że wygląda podobnie jak poprzednio opisany, różni się od niego tym, że odpowiedzialność takiej metody ogranicza się do ustawiania
konkretnej wartości w obiekcie. Nie definiujemy tutaj żadnych algorytmów.
Tego typu metoda jest określana jako
metoda ustawiająca (
setter).
Jej zachowanie jest podobne do tego, które pokazywaliśmy w przypadku konstruktora obiektu, ale różni się tym, że obiekt musi być najpierw stworzony. W przypadku konstruktora
przypisanie następuje już w trakcie tworzenia obiektu.
Tutaj ponownie nie ma żadnej zwróconej wartości, więc niczego nie przypiszemy po wykonaniu tej metody.
Uruchamiamy jedynie operację ustawienia danych w obiekcie (przypisanie kategorii do pola w obiekcie klasy
Item).
Metoda z parametrami i z wartością zwracaną
W takim przypadku
typ zwracanej wartości określamy zgodnie z typem obiektu zwracanego przez metodę, a parametr (albo parametry) określamy podając typ wartości oraz nazwę parametru (lub parametrów).
Na przykład możemy stworzyć metodę, która przyjmie jako parametr identyfikator obiektu o typie prostym
int, a zwróci na jego podstawie cały obiekt
przechowywany w kolekcji danych
items (o kolekcjach pomówimy w niedalekiej przyszłości).
Zwrócony obiekt przypisujemy w miejscu wywołania do zmiennej obiektowej o tym samym typie:
Metody z parametrami i z wartością zwracaną są też wykorzystywane w kontekście wykonywania algorytmów przetwarzających dane, których rezultat działania jest istotny dla
cześci programu, z której zostały wywołane.
Przykładem takiej metody może być metoda wyszukująca obiekty na podstawie wprowadzonych kryteriów.
Tutaj przedstawiliśmy tylko ramy metody, gdyż na tym etapie wyjaśnienie tego typu algorytmu jest zbyt skomplikowane.
Zobaczmy jeszcze wywołanie. Oczywiście zwrócony obiekt również przypisujemy do zmiennej obiektowej o tym samym typie:
Słowo o getterach i setterach
Na tym etapie proponujemy ten akapit potraktować jako kolejną ciekawostkę. Zresztą użyjemy konwencji i napiszemy go używając
zdefiniowango w tym celu formatowania...
Ciekawostka.
Warto wiedzieć, że istnieją pewne możliwości, aby
nie tworzyć getterów i setterów własnoręcznie. Bardziej zaawansowani programiści używają biblioteki
Lombok, która potrafi wygenerować metody pobierające i ustawiające w danej klasie.
Jeśli jesteście zainteresowani tym tematem to podajemy linka, gdzie można o tym poczytać -
GetterSetter.
Pamiętajcie jednak, że warto jest najpierw nauczyć się typowych zasad obowiązujących w programowaniu, a dopiero
później korzystać z drogi na skróty (tymbardziej że do użycia Lomboka jest wymagana jeszcze dodatkowa wiedza, na przykład z tematu adnotacji).
Autor: Jarek Klimas
Data: 03 stycznia 2024
Labele: Backend, Podstawowy, Java
Czy informacje, które otrzymałeś, były pomocne?
Jeśli tak, zapraszam Cię do podarowania mi kawy.
Linki:
https://www.w3schools.com/java/java_class_methods.asp
https://projectlombok.org/features/GetterSetter
Masz pytanie dotyczące prezentowanego materiału?
Coś jest dla Ciebie niejasne i Twoje wątpliwości przeszkadzają Ci w pełnym zrozumieniu treści?
Napisz do nas maila, a my chętnie znajdziemy odpowiednie rozwiązanie.
Najciekawsze pytania wraz z odpowiedziami będziemy publikować pod rozdziałem.
Nie czekaj. Naucz się programować jeszcze lepiej.