Historisch gezien, in sommige talen (bijvoorbeeld C++), staat programmeren toe om standaard operators te overbelasten (operator overloading) om gebruikersgegevens types meer "natuurlijk" te maken in gebruik. In Java werd tijdens het ontwerpen van de taal besloten om operators niet over te laden, om te vechten tegen onnodige complexiteit en moeilijk leesbare code.
Probleem is dat het soms echt handig zou zijn om gedrag van operators te definiëren voor onze objecten, bijvoorbeeld + voor het optellen van vectoren, maar dit is in Java op syntactisch niveau niet toegestaan.
Oplossing — definieer gewone methoden (bijvoorbeeld add, multiply) voor het werken met objecten of gebruik standaardmethoden: overschrijf de methods equals() en compareTo() voor vergelijking; of pas ontwerppatronen toe (bijvoorbeeld het "Builder" of "Composite" patroon).
Voorbeeldcode:
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)"
Belangrijke kenmerken:
Kan je in Java de operator == overbelasten voor je klassen zodat deze waarden vergelijkt en niet referenties?
Nee, de operator == vergelijkt altijd referenties voor objecten van klassen. Om waarden van objecten te vergelijken, moet je equals() overschrijven en deze overal gebruiken waar logische gelijkheid belangrijk is.
Is het mogelijk om het gedrag "a + b" te creëren voor je eigen klassen?
Alleen via gewone methods, bijvoorbeeld a.add(b). De syntaxis voor operator overloading, zoals in C++, wordt niet ondersteund.
Gedraagden strings (String) zich niet als een overbelastte operator '+' in Java?
Eigenlijk werkt de concatenatie van strings met + alleen voor het type String, en wordt ondersteund op het niveau van de compiler - dit is een speciale syntaxisregel.
Een ontwikkelaar gebruikt == voor het vergelijken van twee punten en verwacht dat de vergelijking true oplevert bij gelijke coördinaten.
Voordelen:
Nadelen:
Een ontwikkelaar implementeert de method equals() om de inhoud van punten te vergelijken, en gebruikt de add() method voor optelling.
Voordelen:
Nadelen: