Archiv der Kategorie: Die wöchentliche Dosis Java

Thema der Woche: Properties und Bean-Bindings

  1. Lies https://docs.oracle.com/javase/8/javafx/properties-binding-tutorial/binding.htm.
  2. Simuliere in einem Beispiel den Unterschied zwischen einem Change- und Invalid-Event.
  3. Was ist ein Java SE Profil und gehört die Property-API immer zu jedem Profil?
  4. Verschaffe Überblick über https://docs.oracle.com/javase/8/javafx/api/javafx/beans/binding/Bindings.html.
  5. Baue ein Bindung für ein double mit folgender Logik: ist das double echt kleiner als 0, ist das Ergebnis -1, wenn es größer/gleich 0 ist, ist das Ergebnis +1.
  6. Schreibe einige neues Bindings:
  • von double -> boolean, wenn double == 0 ist,
  • von Point -> double für den Abstand zum Nullpunkt
  • von String -> Point, wobei der String „1,23“ dann zum new Point(1,23) wird
  • verknüpfe die drei letzten Properties, dass ein String mit einem Punkt auf boolean abgebildet wird

Thema der Woche: JSON-Verarbeitung

JSON ist ein beliebtes Format für Web-Services geworden, ließ die Einführung unter http://www.json.org/. Was ergeben die Diskussionen unter http://stackoverflow.com/questions/3536893/what-are-the-pros-and-cons-of-xml-and-json für Vor-/Nachteile?

Für Java gibt es diverse Bibliotheken und seit Java EE 7 ist ein Reader/Writer auch Teil vom Standard. In der Regel werden Autoren aber zu externen Libs greifen, etwa http://www.json.org/java/index.html, https://github.com/FasterXML/jackson oder http://jettison.codehaus.org/.

Beziehe das Jar für json.org, verstehe das Beispiel http://www.concretepage.com/java/example_json_java und lasse es laufen.

Mache dich kurz mit http://www.geojson.org/ vertraut. Was sagt die http://www.geojson.org/geojson-spec.html zum Unterschied von Polygon und MultiPolygon?

http://www.mapfish.org/svn/mapfish/contribs/java-geojson/ ist eine Bibliothek für das GeoJSON-Format; intern baut es auf json.org auf. Binde die Bibliothek ein und beziehe über vom Webserver http://openstreetmap.us/~migurski/vector-datasource/ eine JSON-Datei und gib die erkannten Geo-Objekte auf der Konsole aus. Für http://tile.openstreetmap.us/vectiles-water-areas/12/656/1582.json soll zum Beispiel so etwas erscheinen:

MultiPolygon mit Koordinaten [-122.30168,37.85751],[-122.30029,37.85071],[-122.30105,37.84776],[-122.30078,37.84630],[-122.30241,37.84564],[-122.29997,37.84620], …
Polygon mit Koordinaten [-122.34366,37.85751],[-122.34366,37.78808],[-122.34375,37.78808], …

Thema der Woche: Performant gedacht?

Diskutiere folgende Fragen:

Frage

richtig

falsch

Native Compiler können viel kompakteren Maschinencode erstellen.

   

n+n ist schneller als 2*n.

   

Anweisungen wie n/2, n/4, n*2 sollte man immer durch Verschieben nachbilden.

   

Für eine switch-Anweisung kennt der Compiler zwei unterschiedliche Umsetzungen in Bytecode.

   

Schleifen soll man immer runterzählen. Das ist viel schneller.

   

Über Weak-Reference verwaltet Objekte werden früher freigegeben, als über Soft-Reference verwaltete Objekte.

   

Synchronisierte Methoden sind nicht viel langsamer im Aufruf als nicht-synchronisierte Methoden.

   

Wenn man schnellen Zugriff auf ein Attribut haben muss, dann würde man auf die get()-Funktion verzichten und das Attribut zum Lesen freigeben. Das ist zwar kein Gutes Design, aber im Zugriff viel schneller.

   

Je tiefer die Vererbungshierarchie ist, desto langsamer ist eine Objekterzeugung.

   

Statische Eigenschaften sind im Zugriff immer viel schneller als Objekteigenschaften.

   

Wenn man intern eine Liste als Datenstruktur benutzt, man möchte diese aber sicher nach außen weitergeben (etwa durch getListe()), dann muss man die Liste immer kopieren.

   

Felder beliebiger Größe zu kopieren ist mit System.arraycopy() immer am schnellsten.

   

Ein String-Objekt aus einem StringBuffer zu erstellen kostet noch einmal Speicher für die gesamte Zeichenkette.

   

""+ganzzahl ist in nettes Idiom zur Konvertierung von Ganzzahlen in Strings, was auch in der Performance nicht schlecht ist.

   

intern() ist eine nützliche Funktion, die mehr Vorteile als Nachteile mit sich bringt.

   

charAt() von String ist schneller als charAt() von StringBuffer.

   

substring() erzeugt ein neues Zeichenfeld-Objekt, das genau den ausgeschnittenen Teil speichert.

   

Liest eine Schleife Zeilen aus einer Datei aus, so kann ein StringTokenizer gut benutzt werden, um die Zeilen zu untersuchen.

   

StringBuffer ist von der Performance ausgezeichnet.

   

Es spielt keine große Rolle, ob man einer HashMap eine Initialgröße gibt oder nicht.

   

Eine Menge von Wahrheitswerten sind in einem boolean-Array gut aufgehoben.

   

Ein BufferedOutputStream um einen beliebigen Stream bringt in jedem Fall einen Geschwindigkeitsvorteil.

   

Eine ArrayList kann viel kompakter serialisiert werden als eine LinkedList.

   

Mit java.nio kann man Dateien viel schneller kopieren als ohne.

   

Ein Server sollte eine Anfrage immer mit einem neuen Thread beantworten.

   

SELECT * FROM Tabelle ist unproblematisch.

   

Es ist egal, ob ich einen ResultSet mit getXXX(String Spaltenname) oder getXXX(int Spaltennummer) abfrage.

   

Für mehrere Anfragen an eine Datenbank ist immer ein PreparedStatement einzusetzen.

   

Eine JTable holt sich beim Scrollen jedes Element neu aus dem Model.

   

Wenn man SwingWorker durch FoxTrot ersetzt, gewinnt man noch einmal Geschwindigkeit bei Swing-Programmen.

   

Ein Obfuscator führt bei Applets zu einer Minimierung der Übertragungszeit.

   

Thema der Woche: XPath und XSLT

Thema der Woche: Collections-Update in Java 7

Thema der Woche: Werte und Operatoren erkennen

Thema der Woche: N+1 SELECT Problem

Bei SQL-Anfragen über mehrere Tabellen trifft man schnell über das N+1 SELECT Problem.

  • Finde mehr zu dem Problem und entwerfe ein Szenario, was das Problem deutlich macht.
  • Welche Lösung gibt es für das Problem in SQL?
  • Wie löst man das Problem in einer Anfragesprache wie JPAQL?
  • Lässt sich das Problem durch geschickte Modellierung entschärfen? Warum ist das insbesondere für NoSQL-Datenbanken essenziell? Welchen Ansatz verfolgt man?

Thema der Woche: Google Cache

  • Studiere aufmerksam https://code.google.com/p/guava-libraries/wiki/CachesExplained.
  • Schreibe ein Swing-Programm mit einer JList und einem eigenen Listen-Model, was zu einem Index die Primfaktorzerlegung berechnet (benutze Google und suche eine Implementierung). Bei 1 wird also 1 angezeigt, bei 2 folgt 1*2, bei 3 dann 3, bei 4 folglich 2*2 usw.
  • Das Ergebnis soll nicht mehr live berechnet werden, sondern über den Google Cache zwischengespeichert werden, was ein beschleunigtes Scrollen bewerkstelligen sollte. Wie lässt sich das integrieren?
  • Gibt es mehrere Möglichkeiten den Google Cache in dem Szenario einzusetzen?

Thema der Woche: Paketierung mit <fx:deploy>

Seit Neustem kann man mit Java auch ausführbare Dateien bzw. Installer bauen. Ließ dazu http://docs.oracle.com/javafx/2/deployment/self-contained-packaging.htm bzw. suche nach weiterer Dokumentation im Netz.

  • Teste das an einer eigenen kleinen Hello-World-Anwendung.
  • Wie groß ist das Ergebnis mit JRE?
  • Welche Zielformate sind möglich und kann man alle etwa auf einem Linux-Build-Server bauen?
  • Nutze log4j und nimm die Jar mit in das Zielformat mit auf. Lassen sich auch native Dateien einbinden?
  • Gilt diese Möglichkeit nur für JavaFX oder auch für für AWT/Swing oder SWT?

Thema der Woche: Etwas Design mit UML

DRUG LORD (http://www.old-games.com/download/5218/druglord) ist ein Spielklassiker für DOS von 1993. Mit Kauf- und Verkauf von Drogen in verschiedenen Städten muss man möglichst viel Geld verdienen.

5218-5-druglord

Bild © old-games.com

Überlege, wie das Spiel in seinem Grundzügen (nur Kauf/Verkauf von Drogen, Orte und Cash aber kein Hospital/Health, keine Waffen, Bank, Schulden) objektorientiert modelliert werden kann. Nutzte UML-Diagramme zur Darstellung. Das Programm soll am Ende lauffähig sein, die Darstellung kann beliebig sein. (Wer das Retro-Feeling mag, kann http://sourceforge.net/projects/javacurses/ ausprobieren.)

Thema der Woche: Servlet-Filter

Was Nordkorea kann, können wir auch. Lies zur Einleitung http://www.spiegel.de/netzwelt/web/html-trick-nordkorea-macht-seinen-fuehrer-groesser-a-872291.html, um eine Idee zu bekommen, was wir vorhaben.

Lege in der IDE ein Web-Projekt an. Setze eine index.jsp in das Wurzelverzeichnis mit Text, der den Namen “Kim Jong Un” enthält (alternativ “Angela Merkel”; je nachdem, wer einem sympathischer ist). Teste die Seite.

Lies http://www.oracle.com/technetwork/java/filters-137243.html und verstehe das Konzept der Filter. Der Code ist mit den Eintragungen in die web.xml nicht mehr ganz aktuell, den letzten Teil kann man daher überspringen.

Kopiere http://www.roseindia.net/java/javaee6/webFilterExample.shtml und probiere es aus. Das Beispiel nutzt die Annotationen aus der aktuellen Servlet-Spezifikation.

Ändere den Filter, so dass er den Namen unseres gewählten Staatsoberhaupts größer setzt. Wie das realisiert ist, ist im Prinzip egal, die einfachster Lösung ist Ok (etwa mit <font size=+1>name</font>).

Thema der Woche: Thread-Kooperation und Benachrichtigung; Schere, Papier, Stein

Zwei Threads sollen auf ein Signal warten, das von einem dritten Threads jede Sekunde gesendet wird. Kommt das Signal, soll sich der erste und zweite Thread zufällig für Schere, Papier oder Stein entscheiden.

  • Welche Klassen und Datenstrukturen helfen bei der Lösung?
  • Wer wertet bei dem kleinen Spiel aus, wer gewonnen hat? Muss es hier eine weitere Benachrichtigung geben?
  • Implementiere eine Lösung.

Thema der Woche: @CheckForNull, @Nonnull

Null-Pointer-Exceptions sind eine Qual, da oftmals eine Referenzvariable null ist, die nicht null sein darf. Das kommt oft erst zur Laufzeit bei ganz besonderen Ausführungspfaden raus.  Mit Annotationen kann man dem ein wenig entgegentreten, da man zum Einen gut dokumentiert was erlaubt ist und was nicht, und zum Anderen Analysetools erlaubt, sich die Ausführungspfade etwas genauer anzuschauen.

Thema der Woche: Externe Programme starten, URL Protokoll unter Windows registrieren

Lies http://openbook.galileocomputing.de/javainsel/javainsel_11_008.html#dodtpd29fe557-8d1f-4a1a-a23e-ce87eda2454b

Schreibe ein Java-Programm, welches per Kommandozeile eine Bug-ID annimmt, und dann die entsprechende Seite unter http://bugs.sun.com/ aufruft. Beispiel: Zur Bug-ID 6787890 soll der Browser http://bugs.sun.com/view_bug.do?bug_id=6787890 ansteuern.

Lies http://msdn.microsoft.com/en-us/library/aa767914(v=vs.85).aspx

Kopiere folgendes in eine temporäre Datei, ersetzte dabei YourApp mit etwas Eigenem und passe den Pfad korrekt auf unser Bug-ID-Öffnen-Programm an. Das Protokoll kann zum Beispiel “sunbugid” sein.

REGEDIT4

[HKEY_CLASSES_ROOT\YourApp]
@=“URL:YourApp Protocol“
„URL Protocol“=““

[HKEY_CLASSES_ROOT\YourApp\DefaultIcon]
@=“\“C:\\Program Files\\YourApp\\YourApp.exe\““

[HKEY_CLASSES_ROOT\YourApp\shell]

[HKEY_CLASSES_ROOT\YourApp\shell\open]

[HKEY_CLASSES_ROOT\YourApp\shell\open\command]
@=“\“C:\\Program Files\\YourApp\\YourApp.exe\“ \“%1\“ \“%2\“ \“%3\“ \“%4\“ \“%5\“ \“%6\“ \“%7\“ \“%8\“ \“%9\““

(Quelle http://stackoverflow.com/questions/389204/how-do-i-create-my-own-url-protocol-e-g-so)

Führe die Datei mit regedit aus.

Steht dann auf einer Webseite die URL sunbugid:6787890 sollte bei der Aktivierung des Links das eigene Java-Programm ein neues Browserfenster mit der Bug-Beschreibung aufkommen.

Thema der Woche: Excel API