Method overloading is de mogelijkheid om meerdere methoden met dezelfde naam maar verschillende parameters (type, volgorde, aantal) in één klasse te creëren. Deze benadering maakt het mogelijk om soortgelijke operaties logisch te groeperen en de leesbaarheid van de code te verhogen.
public class MathUtil { public int sum(int a, int b) { return a + b; } public double sum(double a, double b) { return a + b; } public int sum(int a, int b, int c) { return a + b + c; } }
Vraag: Kun je methoden alleen op basis van het returntype overbelasten (zonder de parameters te wijzigen)?
Antwoord: Nee. Overloading is alleen mogelijk bij verschillen in de parameterlijst. Verschillen alleen op basis van het returntype zullen leiden tot een compilatiefout.
void foo(int a) {} int foo(int a) { return 1; } // Fout! Het returntype wordt niet meegenomen bij overloading.
Verhaal
In een project heeft een ontwikkelaar twee methoden gemaakt:
public void process(int x, double y) {...} public void process(double x, int y) {...}Bij het aanroepen van
process(5, 10)kon de compiler de juiste versie niet kiezen, wat leidde tot een fout over ambiguïteit bij het aanroepen. Dit vertraagde de oplevering van de module.
Verhaal
In een applicatie waren er methoden met overloading op basis van varargs en arrays:
public void log(String... messages) {...} public void log(String[] messages) {...}Het doorgeven van een array
String[] dataactiveerde niet altijd de verwachte overloading, waardoor sommige data verkeerd gelogd werden — een deel van de informatie ging verloren! Het verschil tussen een array en varargs bleek kritisch te zijn.
Verhaal
Een ontwikkelaar overloadde methoden van een klasse, zonder rekening te houden met autoboxing van types:
public void save(Integer i) {...} public void save(int i) {...}Bij het aanroepen van
save(null)trad er een NullPointerException op aan de aanroepkant met primitive int, omdat Java het meest specifieke type (int) kiest, maar null kan niet naar een primitief type worden geconverteerd!