2.10 Komentarze#
Rodzaje komentarzy w Javie#
Java obsługuje trzy rodzaje komentarzy:
- Komentarze jednoliniowe -
// - Komentarze wieloliniowe -
/* */ - Komentarze dokumentujące -
/** */
Komentarze “standardowe”#
Komentarze jednoliniowe#
public class Przykład {
private int x; // To jest komentarz jednoliniowy
public void metoda() {
int y = 10; // Inicjalizacja zmiennej y
// Ta linia jest całkowicie skomentowana
x = y * 2;
}
}
Komentarze wieloliniowe#
/*
* To jest komentarz wieloliniowy.
* Może zawierać wiele linii tekstu
* i jest ignorowany przez kompilator.
*/
public class KomentarzWieloliniowy {
public void metoda() {
/*
* Komentarz może być umieszczony
* w dowolnym miejscu kodu
*/
int x = 5;
/* Krótki komentarz wieloliniowy */
int y = x * 2;
}
}
Komentarze dokumentujące#
Komentarze dokumentujące służą do automatycznego generowania dokumentacji za pomocą narzędzia javadoc. Zaczynają się od /** i kończą */.
Podstawowa składnia#
/**
* Klasa reprezentująca prostokąt.
* Zawiera metody do obliczania pola i obwodu.
*
* @author Jan Kowalski
* @version 1.0
* @since 1.0
*/
public class Prostokąt {
private double szerokość;
private double wysokość;
/**
* Konstruktor tworzący prostokąt o podanych wymiarach.
*
* @param szerokość szerokość prostokąta (musi być > 0)
* @param wysokość wysokość prostokąta (musi być > 0)
* @throws IllegalArgumentException gdy wymiary są <= 0
*/
public Prostokąt(double szerokość, double wysokość) {
if (szerokość <= 0 || wysokość <= 0) {
throw new IllegalArgumentException("Wymiary muszą być większe od zera");
}
this.szerokość = szerokość;
this.wysokość = wysokość;
}
/**
* Oblicza pole prostokąta.
*
* @return pole prostokąta jako iloczyn szerokości i wysokości
*/
public double obliczPole() {
return szerokość * wysokość;
}
/**
* Oblicza obwód prostokąta.
*
* @return obwód prostokąta
* @see #obliczPole()
*/
public double obliczObwód() {
return 2 * (szerokość + wysokość);
}
/**
* Zwraca szerokość prostokąta.
*
* @return szerokość prostokąta
*/
public double getSzerokość() {
return szerokość;
}
/**
* Ustawia nową szerokość prostokąta.
*
* @param szerokość nowa szerokość (musi być > 0)
* @throws IllegalArgumentException gdy szerokość <= 0
*/
public void setSzerokość(double szerokość) {
if (szerokość <= 0) {
throw new IllegalArgumentException("Szerokość musi być większa od zera");
}
this.szerokość = szerokość;
}
}
Tagi dokumentujące#
Najważniejsze tagi używane w komentarzach dokumentujących:
| Tag | Opis | Zastosowanie |
|---|---|---|
@author | Autor klasy/interfejsu | Klasy, interfejsy |
@version | Wersja klasy/interfejsu | Klasy, interfejsy |
@since | Wersja od której element istnieje | Wszystkie |
@param | Opis parametru metody | Metody, konstruktory |
@return | Opis wartości zwracanej | Metody |
@throws | Opis zgłaszanego wyjątku | Metody, konstruktory |
@see | Odniesienie do innego elementu | Wszystkie |
@deprecated | Element przestarzały | Wszystkie |
Przykład z wszystkimi tagami#
/**
* Kalkulator do podstawowych operacji matematycznych.
*
* @author Anna Nowak
* @author Piotr Kowalski
* @version 2.1
* @since 1.0
*/
public class Kalkulator {
/**
* Stała reprezentująca PI.
*
* @since 2.0
*/
public static final double PI = 3.14159265359;
/**
* Dodaje dwie liczby.
*
* @param a pierwsza liczba
* @param b druga liczba
* @return suma liczb a i b
* @see #odejmij(double, double)
* @since 1.0
*/
public double dodaj(double a, double b) {
return a + b;
}
/**
* Dzieli dwie liczby.
*
* @param dzielna liczba dzielona
* @param dzielnik liczba przez którą dzielimy
* @return wynik dzielenia
* @throws ArithmeticException gdy dzielnik wynosi zero
* @see #pomnóż(double, double)
* @since 1.0
*/
public double podziel(double dzielna, double dzielnik) {
if (dzielnik == 0) {
throw new ArithmeticException("Dzielenie przez zero");
}
return dzielna / dzielnik;
}
/**
* Oblicza pierwiastek kwadratowy.
*
* @param liczba liczba z której obliczamy pierwiastek
* @return pierwiastek kwadratowy z liczby
* @throws IllegalArgumentException gdy liczba jest ujemna
* @deprecated Użyj {@link Math#sqrt(double)} zamiast tej metody
* @since 1.0
*/
@Deprecated
public double pierwiastek(double liczba) {
if (liczba < 0) {
throw new IllegalArgumentException("Liczba nie może być ujemna");
}
return Math.sqrt(liczba);
}
}
Komentarze dla pól#
public class KonfiguracjaAplikacji {
/**
* Maksymalna liczba połączeń do bazy danych.
* Domyślna wartość to 10 połączeń.
*
* @since 1.0
*/
private static final int MAX_POŁĄCZEŃ = 10;
/**
* Timeout dla operacji sieciowych w milisekundach.
*
* @see #setTimeout(int)
* @since 1.2
*/
private int timeout = 5000;
/**
* Flaga określająca czy logowanie jest włączone.
*
* @deprecated Będzie usunięte w wersji 3.0
* @since 1.0
*/
@Deprecated
public boolean debugMode = false;
}
Generowanie dokumentacji#
Polecenie javadoc#
# Podstawowe użycie
javadoc *.java
# Z określeniem katalogu docelowego
javadoc -d docs *.java
# Z dodatkowymi opcjami
javadoc -d docs -author -version -use -windowtitle "Moja Aplikacja" *.java
# Dla pakietu
javadoc -d docs com.mojafirma.projekt
Opcje javadoc#
-d katalog- katalog docelowy dla dokumentacji-author- uwzględnij informacje o autorach-version- uwzględnij informacje o wersji-use- generuj strony z informacjami o użyciu klas-windowtitle- tytuł okna przeglądarki-doctitle- tytuł dokumentacji-bottom- tekst na dole każdej strony
Przykład pliku HTML generowanego przez javadoc#
Po uruchomieniu javadoc dla klasy Prostokąt, zostanie wygenerowana dokumentacja HTML zawierająca:
- Przegląd klasy z opisem
- Listę konstruktorów z opisami parametrów
- Listę metod z opisami parametrów i zwracanych wartości
- Informacje o wyjątkach
- Odnośniki między powiązanymi elementami
Najlepsze praktyki#
Dobre komentarze#
/**
* Oblicza podatek VAT od podanej kwoty.
*
* @param kwotaNetto kwota netto w złotych
* @param stawkaVAT stawka VAT jako procent (np. 23 dla 23%)
* @return kwota podatku VAT
*/
public double obliczVAT(double kwotaNetto, double stawkaVAT) {
return kwotaNetto * (stawkaVAT / 100.0);
}
// Korekta zaokrąglenia dla obliczeń finansowych
BigDecimal result = amount.setScale(2, RoundingMode.HALF_UP);
Komentarze do unikania#
// ZŁE PRZYKŁADY:
// Zwiększ i o 1
i++;
/**
* Getter dla pola nazwa
* @return nazwa
*/
public String getNazwa() {
return nazwa; // To oczywiste z kodu
}
// TODO: Naprawić to później (komentarz z 2018 roku)
Wskazówki#
- Komentuj DLACZEGO, nie CO - kod pokazuje co robi, komentarz powinien wyjaśniać dlaczego
- Aktualizuj komentarze wraz ze zmianami w kodzie
- Używaj javadoc dla publicznego API
- Bądź zwięzły ale konkretny
- Unikaj komentarzy oczywistych
- Komentuj algorytmy złożone i nietypowe rozwiązania
Narzędzie javadoc było rewolucyjne w latach 90. - umożliwiało automatyczne generowanie dokumentacji bezpośrednio z kodu źródłowego, co znacznie ułatwiło utrzymanie aktualnej dokumentacji.