Die Java Klassenbibliothek

Autoboxing

Behandlung der null beim Unboxing (5 Minuten)

Lässt sich eine Null derart umwandeln: int i = null?

Ist Folgendes zu schreiben sinnvoll?

Map<String,Integer> map = new HashMap<>();
map.put( "Eins", 1 );
int eins = map.get( "eins" );

Überraschung beim Unboxing (5 Minuten)

Gesucht ist das Ergebnis der Bildschirmausgaben. Überlege erst, übersetze dann das Programm und beobachte das Ergebnis.

Integer i11 = 1;
Integer i12 = 1;
System.out.println( i11 == i12 );
System.out.println( i11 <= i12 );
System.out.println( i11 >= i12 );

Integer i21 = 1000;
Integer i22 = 1000;
System.out.println( i21 == i22 );
System.out.println( i21 <= i22 );
System.out.println( i21 >= i22 );

Überlagen von Methoden

Kopiere die drei folgenden Methoden und erkläre die Ausgabe:

public static void someOverloadedMethod( int argInt ) {
  out.printf( "In someMethod(int) with type: %s %d%n", int.class.getName(), argInt );
}
public static void someOverloadedMethod( Object argObject ) {
  out.printf( "In someMethod(Object) with type: %s value:%s%n", argObject.getClass().getName(), argObject );
}
public static void main( String[] args )
{
  Integer intWrapper = 1234;
  int intPrim = 4567;
  Object anObjectWithBoxedInteger = 7890;
  someOverloadedMethod( intWrapper );
  someOverloadedMethod( 10 );
  someOverloadedMethod( anObjectWithBoxedInteger );
}

Aufzählungstypen (enum)

Währungen als Aufzählungen

Definiere eine Aufzählung Currency für einige Währungen nach ISO 4217, etwa EUR, USD.

Lösung

Eingaben und Fallunterscheidung

Der Benutzer soll in JOptionPane.showInputDialog(...) eine Währung nach ISO 4217 eingeben. Für die Eingabe soll das passende enum-Objekt gesucht werden. Eine Fallunterscheidung soll für einige enums eine Meldung auf dem Bildschirm ausgeben.

Lösung

Neue statische Methoden in Aufzählungstypen

Gib der Currency eine Methode random(), die eine zufällige Währung liefert.

System.out.println( Currency.random() );

Comparator-Implementierungen über ein enum *

Teil 1: Ein Aufzählungstyp kann Schnittstellen implementieren. Deklariere eine enum WattComparators die Comparator für Konsumgeräte implementiert mit genau einem Aufzählungselement INSTANCE:

enum WattComparators implements ... {
  INSTANCE;
  ...
}

Wer nun diesen Komparator benötigt, nutzt ihn direkt unter WattComparators.INSTANCE.

Teil 2: WattComparators soll zwei Komparatoren bekommen: INCREASING und DECREASING; dafür soll INSTANCE wegfallen.

Design einer Umrechnungssoftware

Wie kann man mit Hilfe der Klasse EnumMap eine Umrechnung programmieren, so dass man eine beliebige Währung in eine andere beliebige Währung umrechnen kann?

Iterator und Iterable

Scanner ist Iterator

Erzeuge einen java.util.Scanner, der mit einer Datei initialisiert wird.

Laufe den Scanner mit den Iterator-Methoden ab.

Nutzte die neue Java 8-Methode forEachRemaining(...), um alle Token auszugeben. Ein Lambda-Ausdruck wäre in der Lösung ein Bonus.

Externe Programme starten

Die Runtime-Umgebung *

Implementiere in Java eine einfache Shell. Führe die eingelesenen Zeilen mit den exec()-Methoden aus der Klasse java.lang.Runtime aus. Gebe die Fehler- und Standardausgabe der Kommandos aus.

$ java Shell >>> 
ls -l 
total 4 
2028 Dec 11 17:30 Sh.class 
 847 Dec 11 17:30 Sh.java 
 433 Dec 11 16:57 makefile 
>>> cat /tmp/x 
/usr/local/gnu/bin/cat: /tmp/x: No such file or directory 
>>> wc 
    0 0 0 
>>> hostname hoppala

Größere Beispielaufgabe *

Schreibe eine Klasse Location, die longitude und latitude speichert. Die Attribute sind vom Type double. Gib Setter/Getter an und einen Standard- und parametrisieren Konstruktor. Die Klasse Location soll die Abstands-Utility-Methode aus http://www.tutego.de/blog/javainsel/2009/09/latitudelongitude-distance-in-java/ bekommen.

Die Klasse Locations soll beliebig viele Location-Objekte speichern können. Dazu ist eine addLocation(...)-Methode nötig, die einen Ort als String mit einer Location annimmt und in eine intern Datenstruktur übernimmt. addLocation(...) soll überladen sein, dass man einmal den Ort über ein Location-Objekt bestimmt und einmal über Longitude und Latitude. Eine toString()-Methode soll angeben, wie viele Orte enthalten sind. Eine Methode Location findLocation(String location) soll die Location für einen Ort zurückgeben. Schreibe eine Methode List<...> within(Location loc, double radius) Methode, die alle Orte liefert, die nicht weiter als radius von dem Ort entfernt sind. Nutzt die passende statische Methode aus Location für den Abstand! Nimm eine überladene Methode within() hinzu, die eine maximale Anzahl Elemente in der Rückgabeliste bestimmt.

Schreibe eine Klasse LocationApplication mit einem main(...). Füge einige Location-Objekte ein und teste die Bereichsabfrage.

Eine Klasse LocationRepository soll zwei statische Methoden enthalten: Locations loadLocations() und void saveLocations(Locations locations). Die Methoden sollen Locations aus einer Text-Datei lesen und schreiben können. Nutze dazu beliebige Geokoordinaten. Das Dateiformat kann frei bestimmt werden.

Passe die Methode within(...) an, so dass die Liste sortiert ist nach dem Abstand zum Anfrageort. Schreibe dazu einen DistanceComparator und nutze die Collections.sort(...)-Methode.

Modelliere mit NetBeans eine grafische Oberfläche, mit zwei Reitern (JTabbedPane). In dem ersten Reiter soll man drei Textboxen haben für Ort, Longitude, Latitude und einen „Hinzufügen“ Button. Damit sollen neue Orte dem Locations hinzugefügt werden. Auf dem zweiten Reiter soll der Anwender Abfragen vornehmen können. Eine Eingabezeile für ein Ort (oder Longitude, Latitude) und Radius soll zu max. 10 Ergebnissen führen.

Installiere Google Earth. Bei einer Bereichsabfrage erzeugte eine KML-Datei mit allen Ergebnissen. Diese Datei soll beim Start von Google Eath als Startparameter mitgegeben werden. Externe Programme startet man mit dem ProcessBuilder. Die Insel gibt ein Beispiel für diese Klasse. Überlegen, wie am einfachsten und effektivsten XML geschrieben werden kann.

Registry für Windows-Hintergrund füllen **

Setze über Eigenschaften/Hintergrund den Hintergrund auf eine Grafik und beobachte, welche Einträge sich ändern. Der Pfad ist: [HKEY_CURRENT_USER\Control Panel\Desktop]. Setze durch ein Java-Programm in der Registry eine neue Grafik. Hinweis: Die Grafik muss im BMP-Format sein und wird erst nach dem nächsten Booten sichtbar.

Klassenlader

Ein eigener Klassenlader **

  1. Eine Xor-Verschlüsselung ist symmetrisch und dreht jedes Bit bezogen auf eine Maske um. Verschlüssle eine Klasse damit.
  2. Implementiere einen eigenen Klassenlader. Er soll wie das Original die Klasse ebenfalls vom Dateisystem holen.
  3. Der Klassenlader soll nun die Klasse mit dem Xor-Null Encoder entschlüsseln.
  4. Die Dateinamen können wir auch noch ändern. Dazu ist wieder ein symmetrisches Verfahren praktisch. Bekannt ist Rot13, ein Verfahren, dessen Bezeichnung sich aus dem Begriff "Rotiere um 13 Zeichen" ableitet. Es eignet sich sehr gut zur Unkenntlichmachung von Texten, da auf den ersten Blick nicht mehr zu erkennen ist, was der Text ursprünglich aussagen wollte. Ändere das Programm Rot13.java so ab, dass es beliebige Strings umwandelt. Passe anschließend den Klassenlader an, sodass er Rot13-umgewandelte Dateinamen nutzt.

Benutzereinstellungen

Konfigurationen

Teste das Preferences-Beispiel, wie es in der Insel implementiert wird.

Was kann man machen, wenn mehr als 8 kiB als Wert gespeichert werden sollen?