Java ondersteunt geen directe operatoroverloading, zoals dit bijvoorbeeld in C++ wordt gedaan. Historisch gezien is deze beperking ingevoerd om de leesbaarheid van de code te vergemakkelijken en dubbelzinnigheid te verminderen: Björn Stroustrup (de maker van C++) en James Gosling (de maker van Java) bespraken deze kwestie, en in Java werd besloten ontwikkelaars niet toe te staan hun eigen gedrag voor operators in te stellen voor hun klassen.
Probleem van operatoroverloading is dat overmatige vrijheid in het definiëren van wiskunde en logica voor gebruikersklassen kan leiden tot moeilijk te traceren bugs en verminderde leesbaarheid van de code, vooral in grote teams.
Oplossing — verbieden van gebruikersoverloading van operators. Java ondersteunt echter methodenoverloading binnen zijn klassen, en het gedrag van operators kan worden geïmiteerd via expliciet gedefinieerde methoden (bijvoorbeeld, .add(), .equals(), .compareTo(), enzovoort).
Voorbeeldcode:
public class Vector2D { private final int x, y; public Vector2D(int x, int y) { this.x = x; this.y = y; } public Vector2D add(Vector2D other) { return new Vector2D(this.x + other.x, this.y + other.y); } } Vector2D v1 = new Vector2D(2, 3); Vector2D v2 = new Vector2D(1, 4); Vector2D sum = v1.add(v2); // in plaats van v1 + v2
Belangrijkste kenmerken:
Is het mogelijk om in Java de operator "+" voor mijn klasse te overladen, zodat ik objecten kan optellen?
Antwoord: Nee, Java ondersteunt geen gebruikersoverloading van wiskundige operators voor door gebruikers gemaakte klassen. De uitzondering is alleen voor strings: de operator "+" roept concatenatie aan via StringBuilder.
Als ik de methode equals() definieer, zal de operator "==" dan werken als waardevergelijking?
Antwoord: Nee, de operator "==" vergelijkt objectreferenties, niet hun inhoud. Voor een correcte waardevergelijking moet de overschreven equals() worden gebruikt.
String a = new String("hello"); String b = new String("hello"); System.out.println(a == b); // false System.out.println(a.equals(b)); // true
Zijn er uitzonderingen waar een standaardoperator zich op een bijzondere manier gedraagt voor niet-standaard klassen?
Antwoord: "Bijzonder" gedrag in Java is alleen geïmplementeerd voor String met de operator "+" en voor primitieve types (automatische conversie en unboxing). Voor andere klassen werken operators normaal (dwz ze worden niet overbelast).
Een jonge ontwikkelaar schreef een klasse Money en begon twee objecten te vergelijken met "==", in de veronderstelling dat ze op waarden zouden worden vergeleken. Dit leidde tot fouten bij het controleren op gelijkheid, die alleen in productie naar voren kwamen.
Voordelen:
Nadelen:
In een project werd een eigen klasse Vector geschreven, alle wiskundige operaties werden expliciet geïmplementeerd, de operator == werd niet gebruikt voor objecten, en de documentatie beschrijft de semantiek van de methoden.
Voordelen:
Nadelen: