/**
* This program is free software; you can redistribute ....
*/packageopenlr.map.teleatlas.sqlite.impl;/**
* Thread safe implementation of the OpenLR {@link openlr.map.MapDatabase} interface for use with a Tele Atlas digital map in SQLite format.
*/publicfinalclassMapDatabaseImplimplements openlr.map.MapDatabase{/** The Constant KILO_BYTE. */privatestaticfinalint KILO_BYTE =1024;/**
* The default logger for this class.
*/privatestaticfinalLogger LOG =Logger.getLogger(MapDatabaseImpl.class);/**
* Static block to read logging configuration.
*/static{if(newFile(LOGGING_PROPERTIES_FILE).exists()){PropertyConfigurator.configureAndWatch(LOGGING_PROPERTIES_FILE, LOGGING_WATCH_DELAY);}else{URL url =MapDatabaseImpl.class.getResource("/"+ LOGGING_PROPERTIES_FILE);if(url !=null){PropertyConfigurator.configure(url);}}}//.... usw..
Frage1: Was bedeuted das .class in Zeile 17? Googlen gibt nur normale Klassendefinitionen.
Bestätigung2: Der static Block ab Zeile 22 wird ja ausgeführt, wenn die Klasse gelanden wird, ohne dass eine Instanz erstellt worden ist... richtig?
Antwort 1: Damit referenzierst Du das Klassenobjekt der Klasse MapDatabaseImpl. In diesem Fall brauchst Du es, um den Logger für diese Klasse zu erzeugen. Der Logger ruft auf diesem Objekt intern getName() (oder war es getSimpleName/getCanonicalName?) auf, sodass im Log der Klassenname mit erscheint. In Zeile 27 ruft Dein Code selbst die Methode getResource auf.
Antwort 2: Ja, genau so ist es.
Also wird der static Block ausgeführt, bevor eine Instanz erstellt wird, soweit so gut. Aber wann genau?
- Wenn die Klasse beim Programmstart/compilevorgang die imports durchcheckt?
- Oder wenn die Klasse zum ersten mal benutzt wird?
--> zB wenn eine static-Methode benutzt wird, ohne dass instanziiert wurde?
- Wenn die Klasse beim Programmstart/compilevorgang die imports durchcheckt?
- Oder wenn die Klasse zum ersten mal benutzt wird?
--> zB wenn eine static-Methode benutzt wird, ohne dass instanziiert wurde?
Michael hat's schon gesagt, wenn die Klasse geladen wird. Jetzt bleibt die Frage, wann wird denn eine Klasse geladen? Das weiß ich erhlich gesagt auch nicht. Ich würde vermuten, das erste Mal, wenn sie irgendwo in irgendeinem Codeschnipsel benutzt wird. Aber sicher bin ich nicht. Aber (und auch das hat Michael schon geschrieben) der exakte Zeitpunkt ist auch nicht so wichtig. Wichtig ist, dass der Code ausgeführt wird ohne, dass eine Instanz der Klasse erzeugt werden muss. Und zum Schluss, man sollte static Blöcke nicht zu sehr überfrachten. Man braucht sie also eher selten.