Geschiedenis van de vraag:
Statische import is geïntroduceerd in Java 5 (JDK 1.5) om de leesbaarheid van de code te vergroten en de overbodigheid ervan te verminderen. Voor de komst van deze mechanismen moest je altijd de volledige naam van de klasse schrijven om statische leden van een andere klasse te gebruiken, wat de code zwaarder en minder schoon maakte.
Probleem:
Het is vaak nodig om herhaaldelijk naar statische methoden of velden binnen één klasse te verwijzen (bijvoorbeeld naar wiskundige functies of constanten). Constante vermelding van de klasse naam bemoeilijkt de leesbaarheid en verhoogt de hoeveelheid code.
Oplossing:
Het mechanisme van statische import laat je statische leden van een klasse (methoden of velden) rechtstreeks importeren, zodat je ernaar kunt verwijzen zonder het voorvoegsel van de klasse naam. Dit vereenvoudigt de code en maakt deze compacter, vooral bij intensief gebruik van bibliotheken zoals Math.
Voorbeeld code:
import static java.lang.Math.*; public class StaticImportExample { public static void main(String[] args) { double x = cos(PI * 2); double y = pow(2, 4); System.out.println(x + ", " + y); } }
Belangrijke eigenschappen:
Kun je alle statische leden van een klasse importeren met een sterretje (Wildcard Static Import)?
Ja, dat kan. De expressie import static java.lang.Math.*; importeert alle statische methoden en velden van deze klasse. Maar dit vermindert de leesbaarheid en kan naamconflicten veroorzaken als die er zijn in andere geïmporteerde klassen.
Kun je statische leden van een niet-bestaande klasse importeren?
Nee, de compiler geeft een foutmelding. Bijvoorbeeld,
import static java.util.List.NONEXISTENT_FIELD; // Compilerfout
Werkt static import voor niet-statische leden van een klasse?
Nee. Static import wordt alleen toegepast op statische methoden en velden. Pogingen om niet-statische leden te importeren zullen resulteren in een compilerfout.
*) vermindert de leesbaarheid en veroorzaakt naamconflictenIn een team gebruikt een programmeur import static java.lang.Math.*; en import static java.util.Collections.*;, zonder aandacht te besteden aan overlappende namen. Als gevolg is het moeilijk te begrijpen welke specifieke methode of constante op elk specifiek punt wordt gebruikt en met de toevoeging van nieuwe bibliotheken - naamconflicten kunnen optreden.
Voordelen:
Nadelen:
De ontwikkelaar importeert alleen de benodigde methoden uit Math, bijvoorbeeld
import static java.lang.Math.PI; import static java.lang.Math.cos;
Het hele project blijft begrijpelijk en onderhoudbaar, en de statische geïmporteerde leden zijn gemakkelijk te volgen.
Voordelen:
Nadelen: