Historycznie w niektórych językach (na przykład, C++), programowanie pozwala na przeciążanie standardowych operatorów (operator overloading), aby uczynić użytkowe typy danych bardziej "naturalnymi" w obsłudze. W Javie na etapie projektowania języka podjęto decyzję o nieprzeciążaniu operatorów, aby walczyć z nadmiarową złożonością i trudnością w czytaniu kodu.
Problem polega na tym, że czasami rzeczywiście byłoby wygodnie definiować zachowanie operatorów dla swoich obiektów, na przykład + do sumowania wektorów, ale to w Javie jest niedopuszczalne na poziomie składni.
Rozwiązanie — zdefiniować normalne metody (na przykład add, multiply) do pracy z obiektami lub stosować standardowe podejścia: nadpisywanie metod equals() i compareTo() do porównań; lub stosować wzorce projektowe (na przykład wzorzec "Budowniczy" lub "Kompozyt").
Przykład kodu:
public class Vector { private int x, y; public Vector(int x, int y) { this.x = x; this.y = y; } public Vector add(Vector other) { return new Vector(this.x + other.x, this.y + other.y); } @Override public String toString() { return "Vector(" + x + ", " + y + ")"; } } Vector v1 = new Vector(1, 2); Vector v2 = new Vector(3, 4); Vector sum = v1.add(v2); // "Vector(4, 6)"
Kluczowe cechy:
Czy można w Javie "przeciążyć" operator == dla swoich klas tak, aby porównywał wartości, a nie referencje?
Nie, operator == zawsze porównuje referencje dla obiektów klas. Aby porównywać wartości obiektów, należy nadpisać equals() i używać go wszędzie tam, gdzie ważna jest logiczna równoznaczność.
Czy można jakoś zrobić zachowanie "a + b" dla własnych klas?
Tylko poprzez normalne metody, na przykład a.add(b). Składnia przeciążania operatorów, jak w C++, nie jest wspierana.
Czy ciągi (String) nie zachowują się jak przeciążony operator '+' w Javie?
W rzeczywistości, konkatenacja ciągów z użyciem + działa tylko dla typu String i jest wspierana na poziomie kompilatora — to specjalna zasada składni.
Programista dla klasy "Punkt" używa == do porównania dwóch punktów i oczekuje, że porównanie zwróci true, gdy współrzędne są takie same.
Zalety:
Wady:
Programista implementuje metodę equals() do porównania zawartości punktów, a do sumowania używa metody add().
Zalety:
Wady: