Soms is het handig om een klasse te gebruiken die alleen statische methoden en statische velden bevat.
Een veelvoorkomend voorbeeld hiervan zijn utility-klassen zoals java.lang.Math, java.util.Arrays, die wiskundige bewerkingen of array-gerelateerde methoden bevatten. Of java.util.Collections, die statische factory-methoden bevat voor het genereren van objecten die een bepaalde interface implementeren.
Deze utility-klassen kunnen worden gebruikt zonder dat er instantie-variabelen of -methoden nodig zijn, dus een constructor is niet nodig. Maar als je geen constructor definieert, genereert de compiler automatisch een publieke default constructor. Daardoor kan de gebruiker niet zien of deze constructor automatisch is gegenereerd.
Om dit te voorkomen, wordt soms een abstracte klasse gebruikt. Maar met een abstracte klasse kun je instantie-aanmaak niet voorkomen, omdat je altijd een subklasse kunt maken en die kunt instantiëren.
Om instantie-aanmaak van een utility-klasse te voorkomen, moet je de toegangsmodifier van de constructor op private zetten.
Als de toegangsmodifier van de default constructor private is, kan deze vanuit de buitenwereld niet worden aangeroepen. Bovendien wordt er een uitzondering gegenereerd als de default constructor intern wordt aangeroepen.
Het gebruik van een private constructor kan voor gebruikers lastig te begrijpen zijn, dus het is raadzaam om er een opmerking bij te plaatsen. Overigens heeft het blokkeren van de constructor met private ook het effect dat erfelijkheid niet meer mogelijk is.
Bron
- Effectieve Java
- https://catsbi.oopy.io/d7f3a636-b613-453b-91c7-655d71fda2b1
Reacties0