Kurs Java

Rodzaje metod w ramach obiektu

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.
public class Item {

    String name;
    Category category;

    public Item(String name, Category category) {
        this.name = name;
        this.category = category;
    }    

    void printItemData() {
        System.out.println(this.name);
        // getName() to inna metoda zdefiniowana w klasie Item
        System.out.println(this.getName());         
        System.out.println(this.category.getName());
    }
    
    ...getName()...
}
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:
public class ItemService {
       
    Item createItem() {
        Item item = new Item("Appa Item 1", new Category(1, "Appa Category 1"));   
        return item;
    } 
}
Zwrócony obiekt przypisujemy do obiektu o tym samym typie:
public static void main(String[] args) {

    ItemService itemService = new ItemService();
    Item item = itemService.createItem();    	
}
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.
public class Item {

    String name;
    Category category;

    public Item(String name, Category category) {
        this.name = name;
        this.category = category;
    }    
    
    Category getCategory() {   
        return this.category;
    }
} 
Taki zwrócony obiekt również przypisujemy do zmiennej obiektowej o tym samym typie:
public static void main(String[] args) {

    Item item = new Item("Appa Item 1", new Category(1, "Appa Category 1"));
    Category category = item.getCategory();     
}
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.

public class ItemService {

    void printItemData(Item item) {
        String itemNameFromItem = item.getName();
        System.out.println(itemNameFromItem);
    }
}    
Tutaj nie ma żadnej zwróconej wartości, więc niczego nie przypiszemy po wykonaniu tej metody:
public static void main(String[] args) {

    ItemService itemService = new ItemService();
    itemService.printItemData();    	
}
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.
public class Item {

    String name;
    Category category;

    public Item(String name) {
        this.name = name;     
    }
        
    void setCategory(Category category) {
        this.category = category;
    } 
}
Tutaj ponownie nie ma żadnej zwróconej wartości, więc niczego nie przypiszemy po wykonaniu tej metody.
public static void main(String[] args) {

    Item item = new Item();
    item.setCategory(new Category(1, "Appa Category 1"));      
}
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).
public class ItemService {

    Item getItemById(int id) {    
        Item item = items.get(id);     
        return item;
    }
} 
Zwrócony obiekt przypisujemy w miejscu wywołania do zmiennej obiektowej o tym samym typie:
public static void main(String[] args) {

    ItemService itemService = new ItemService();
    Item item = itemService.getItemById(1);      
}
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.
public class ItemService {

    Item searchByCriteria(SearchCriteria searchCriteria) {    
        // Pobieranie danych z obiektu searchCriteria, obrabianie ich, 
        // na przykład wybieranie tylko niektórych wartości itp...
        
        ...
        
        return item;
    }
} 
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:
public class ItemService {

    ItemService itemService = new ItemService();
    // przykładowy obiekt przechowaujący kryteria wyszukiwania
    SearchCriteria searchCriteria = SearchCriteria("Appa Item no. 3", true, "draft");
    Item item = itemService.searchByCriteria(searchCriteria);
} 

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).
Linki
https://www.w3schools.com/java/java_class_methods.asp
https://projectlombok.org/features/GetterSetter
Masz pytanie dotyczące tego rozdziału? Zadaj je nam!
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.
kursjava@javappa.com

Stale się rozwijamy, a więc bądź na bieżąco!
Na ten adres będziemy przesyłać informacje o ważniejszych aktualizacjach, a także o nowych materiałach pojawiających się na stronie.
Polub nas na Facebooku:
Nasi partnerzy:
Javappa to również profesjonalne usługi programistyczne oparte o technologie JAVA. Jeśli chesz nawiązać z nami kontakt w celu uzyskania doradztwa bądź stworzenia aplikacji webowej powinieneś poznać nasze doświadczenia.
Kliknij O nas .