In eigener Sache: BINARIUM eröffnet

Neben meiner Tätigkeit als Java-Autor und Trainer beschäftige ich mich seit fünf Jahren mit dem Aufbau eines Museums für Heimcomputer und Videospielkonsolen. Angefangen habe ich im April 2011 mit dem Aufbau der Sammlung. Heute zählt die Sammlung etwa 800 relevante Objekte.

Nachdem die Sammlung eine hinreichende Größe erreichte, erwarb ich im Juli 2014 eine 2400 qm-Immobilie der ehemaligen Ruhrkohle AG und baute es zu einen Museum, Café/Bistro und Schulungsräumen um. tutego führt die öffentlichen Java-Trainings schon seit über einem Jahr durch, das Gastro NETZWERK ist seit Oktober geöffnet. Mit etwa einem Jahr Verspätung kann es nun auch mit dem Museum im EG losgehen.

Am 8.12.2016 eröffnet das BINARIUM, das Deutsche Museum der digitalen Kultur, in Dortmund Huckarde das Erdgeschoss. Die umfassende Sammlung bietet einen Überblick über die Videospielkonsolen und Geschichte der letzten 40 Jahre. Mehr als 200 Exponate und 20 Spielstationen erwarten euch.

2017 wird die Ausstellung mit persönlichen Computern/Heimcomputern im OG eröffnet.

PlantUML, Styling von Diagrammen

PlantUML ist ein Open Source Projekt, zum Erstellen von UML-Diagrammen in einer textuellen Sprache. Zum Beispiel:

Bob->Alice : hello

Die Heimat des Projektes ist http://plantuml.com/.

Man beschreibt sein grafisches Projekt in dieser Sprache und die Software erzeugt dann das Diagramm. Allerdings ist der Standardstyle weit vom „quasi“-Standard entfernt. Um aber auch User in Genuss dieser Software kommen zu lassen, die grafisch weniger bunte Diagramme vorziehen, bedarf es einiger Anpassungen.

Im Folgenden ein paar Anpassungen, die mit PlantUML ein Diagramm erzeugen, das mehr dem „quasi“ Standard entspricht:

skinparam monochrome true

Entfernt die Farben aus dem Diagramm

skinparam shadowing false

Entfernt den Schlagschatten

skinparam classAttributeIconSize 0

Entfernt die Custom-Icons vor Klassenattributen und Methoden (Nur Klassendiagramm)

skinparam DefaultFontName arial

Legt die Standard-Schriftart fest (Der Name ist hier Systemabhängig)

skinparam DefaultFontSize 12

Legt die Standard-Schriftgröße in Pixeln fest.

skinparam ClassFontStyle bold

Ändert die Schrift im Klassenkopf auf Fettdruck (Nur Klassendiagramm)

hide empty fields

Versteckt leere Felder zB.wenn eine Klasse keine Attribute hat.

hide circle

Versteckt das Icon vor den Klassennamen
Der Effekt:

PlantUML Standard
PlantUML Standard

Anzeige parametrisiert:

PlantUML mit Parametern
PlantUML mit Parametern

Zur Verwendung genannter Befehle

Um die Parameter einzusetzen, genügt es sie in dem Körper des UML-Diagrammtextes, als erstes aufzuführen z. B.:

@startuml
skinparam monochrome true
skinparam shadowing false
skinparam classAttributeIconSize 0
skinparam DefaultFontName arial
skinparam DefaultFontSize 12
skinparam ClassFontStyle bold
hide empty fields
hide circle
...
@enduml

Des Weiteren ist es möglich, wenn man viele Diagramme hat, die man alle gleich gestalten möchte, die Parameter einmalig in einer separaten Datei anzulegen, z. B. style.iuml und diese dann per !include einzubinden. In dieser Datei wird auf @startuml und @enduml verzichtet. Zur Verdeutlichung:

Inhalt der style.iuml:

skinparam monochrome true
skinparam shadowing false
skinparam classAttributeIconSize 0
skinparam DefaultFontName arial
skinparam DefaultFontSize 12
skinparam ClassFontStyle bold
hide empty fields
hide circle

Inhalt einer möglichen UML-Datei

@startuml
!include style.iuml
...
@enduml

Autor: André Fischer

HTML-Datei in eine PDF-Datei mit java-wkhtmltopdf-wrapper

Lösungen, um aus Java heraus eine HTML-Datei eine PDF-Datei zu generieren gibt es einige, allerdings ist die Qualität nicht immer gut. Unter Zuhilfenahme der freien Software wkhtmltopdf auf der Basis der WebKit Rendering Engine gibt es mitunter bessere Ergebnisse. Für wkhtmltopdf gibt es mit java-wkhtmltopdf-wrapper von Jhonny Mertz einen passendem quelloffenen Java-Wrapper.

wkhtmltopdf

Wkhtmltopdf ist eine Open Source Applikation die Headless (ohne jegliche grafische Oberfläche) eine HTML-Datei rendert und als PDF-Datei speichert. Gesteuert wird das Programm über die Kommandozeile im folgenden Format:

$ wkhtmltopdf <<Quell-HTML>> <<Ziel-PDF>>

ein Beispiel zum besseren Verständnis:

$ wkhtmltopdf www.google.com google.pdf

Um erfolgreich aufgerufen zu werden, muss entweder die Kommandozeile im Installationsverzeichnis von wkhtmltopdf befinden oder wkhtmltopdf in den Umgebungsvariablen (PATH) hinzugefügt werden, andernfalls kann die Anwendung nicht gefunden werden.

Des weiteren kann der Applikation eine Vielzahl von Parametern übergeben werden, um das Ergebnis den eigenen Bedürfnissen anzupassen, z. B. mit dem Parameter -s kann man die Größe der PDF-Datei festlegen. Der Standard liegt hier bei DIN A4.

Ein Beispiel für DIN A3 Format:

$ wkhtmltopdf www.google.com google.pdf -s “A3“

Dies ist natürlich nur ein Bruchteil der möglichen Parameter, eine vollständige Liste in Englisch finden Sie hier:

Global Options:

    --collate                       Collate when printing multiple copies
                                      (default)
      --no-collate                    Do not collate when printing multiple
                                      copies
      --cookie-jar <path>             Read and write cookies from and to the
                                      supplied cookie jar file
      --copies <number>               Number of copies to print into the pdf
                                      file (default 1)
  -d, --dpi <dpi>                     Change the dpi explicitly (this has no
                                      effect on X11 based systems)
  -H, --extended-help                 Display more extensive help, detailing
                                      less common command switches
  -g, --grayscale                     PDF will be generated in grayscale
  -h, --help                          Display help
      --htmldoc                       Output program html help
      --image-dpi <integer>           When embedding images scale them down to
                                      this dpi (default 600)
      --image-quality <integer>       When jpeg compressing images use this
                                      quality (default 94)
      --license                       Output license information and exit
  -l, --lowquality                    Generates lower quality pdf/ps. Useful to
                                      shrink the result document space
      --manpage                       Output program man page
  -B, --margin-bottom <unitreal>      Set the page bottom margin
  -L, --margin-left <unitreal>        Set the page left margin (default 10mm)
  -R, --margin-right <unitreal>       Set the page right margin (default 10mm)
  -T, --margin-top <unitreal>         Set the page top margin
  -O, --orientation <orientation>     Set orientation to Landscape or Portrait
                                      (default Portrait)
      --page-height <unitreal>        Page height
  -s, --page-size <Size>              Set paper size to: A4, Letter, etc.
                                      (default A4)
      --page-width <unitreal>         Page width
      --no-pdf-compression            Do not use lossless compression on pdf
                                      objects
  -q, --quiet                         Be less verbose
      --read-args-from-stdin          Read command line arguments from stdin
      --readme                        Output program readme
      --title <text>                  The title of the generated pdf file (The
                                      title of the first document is used if not
                                      specified)
  -V, --version                       Output version information and exit

Outline Options:
      --dump-default-toc-xsl          Dump the default TOC xsl style sheet to
                                      stdout
      --dump-outline <file>           Dump the outline to a file
      --outline                       Put an outline into the pdf (default)
      --no-outline                    Do not put an outline into the pdf
      --outline-depth <level>         Set the depth of the outline (default 4)

Page Options:
      --allow <path>                  Allow the file or files from the specified
                                      folder to be loaded (repeatable)
      --background                    Do print background (default)
      --no-background                 Do not print background
      --cache-dir <path>              Web cache directory
      --checkbox-checked-svg <path>   Use this SVG file when rendering checked
                                      checkboxes
      --checkbox-svg <path>           Use this SVG file when rendering unchecked
                                      checkboxes
      --cookie <name> <value>         Set an additional cookie (repeatable),
                                      value should be url encoded.
      --custom-header <name> <value>  Set an additional HTTP header (repeatable)
      --custom-header-propagation     Add HTTP headers specified by
                                      --custom-header for each resource request.
      --no-custom-header-propagation  Do not add HTTP headers specified by
                                      --custom-header for each resource request.
      --debug-javascript              Show javascript debugging output
      --no-debug-javascript           Do not show javascript debugging output
                                      (default)
      --default-header                Add a default header, with the name of the
                                      page to the left, and the page number to
                                      the right, this is short for:
                                      --header-left='[webpage]'
                                      --header-right='[page]/[toPage]' --top 2cm
                                      --header-line
      --encoding <encoding>           Set the default text encoding, for input
      --disable-external-links        Do not make links to remote web pages
      --enable-external-links         Make links to remote web pages (default)
      --disable-forms                 Do not turn HTML form fields into pdf form
                                      fields (default)
      --enable-forms                  Turn HTML form fields into pdf form fields
      --images                        Do load or print images (default)
      --no-images                     Do not load or print images
      --disable-internal-links        Do not make local links
      --enable-internal-links         Make local links (default)
  -n, --disable-javascript            Do not allow web pages to run javascript
      --enable-javascript             Do allow web pages to run javascript
                                      (default)
      --javascript-delay <msec>       Wait some milliseconds for javascript
                                      finish (default 200)
      --load-error-handling <handler> Specify how to handle pages that fail to
                                      load: abort, ignore or skip (default
                                      abort)
      --load-media-error-handling <handler> Specify how to handle media files
                                      that fail to load: abort, ignore or skip
                                      (default ignore)
      --disable-local-file-access     Do not allowed conversion of a local file
                                      to read in other local files, unless
                                      explicitly allowed with --allow
      --enable-local-file-access      Allowed conversion of a local file to read
                                      in other local files. (default)
      --minimum-font-size <int>       Minimum font size
      --exclude-from-outline          Do not include the page in the table of
                                      contents and outlines
      --include-in-outline            Include the page in the table of contents
                                      and outlines (default)
      --page-offset <offset>          Set the starting page number (default 0)
      --password <password>           HTTP Authentication password
      --disable-plugins               Disable installed plugins (default)
      --enable-plugins                Enable installed plugins (plugins will
                                      likely not work)
      --post <name> <value>           Add an additional post field (repeatable)
      --post-file <name> <path>       Post an additional file (repeatable)
      --print-media-type              Use print media-type instead of screen
      --no-print-media-type           Do not use print media-type instead of
                                      screen (default)
  -p, --proxy <proxy>                 Use a proxy
      --radiobutton-checked-svg <path> Use this SVG file when rendering checked
                                      radiobuttons
      --radiobutton-svg <path>        Use this SVG file when rendering unchecked
                                      radiobuttons
      --run-script <js>               Run this additional javascript after the
                                      page is done loading (repeatable)
      --disable-smart-shrinking       Disable the intelligent shrinking strategy
                                      used by WebKit that makes the pixel/dpi
                                      ratio none constant
      --enable-smart-shrinking        Enable the intelligent shrinking strategy
                                      used by WebKit that makes the pixel/dpi
                                      ratio none constant (default)
      --stop-slow-scripts             Stop slow running javascripts (default)
      --no-stop-slow-scripts          Do not Stop slow running javascripts
      --disable-toc-back-links        Do not link from section header to toc
                                      (default)
      --enable-toc-back-links         Link from section header to toc
      --user-style-sheet <url>        Specify a user style sheet, to load with
                                      every page
      --username <username>           HTTP Authentication username
      --viewport-size <>              Set viewport size if you have custom
                                      scrollbars or css attribute overflow to
                                      emulate window size
      --window-status <windowStatus>  Wait until window.status is equal to this
                                      string before rendering page
      --zoom <float>                  Use this zoom factor (default 1)

Headers And Footer Options:
      --footer-center <text>          Centered footer text
      --footer-font-name <name>       Set footer font name (default Arial)
      --footer-font-size <size>       Set footer font size (default 12)
      --footer-html <url>             Adds a html footer
      --footer-left <text>            Left aligned footer text
      --footer-line                   Display line above the footer
      --no-footer-line                Do not display line above the footer
                                      (default)
      --footer-right <text>           Right aligned footer text
      --footer-spacing <real>         Spacing between footer and content in mm
                                      (default 0)
      --header-center <text>          Centered header text
      --header-font-name <name>       Set header font name (default Arial)
      --header-font-size <size>       Set header font size (default 12)
      --header-html <url>             Adds a html header
      --header-left <text>            Left aligned header text
      --header-line                   Display line below the header
      --no-header-line                Do not display line below the header
                                      (default)
      --header-right <text>           Right aligned header text
      --header-spacing <real>         Spacing between header and content in mm
                                      (default 0)
      --replace <name> <value>        Replace [name] with value in header and
                                      footer (repeatable)

TOC Options:
      --disable-dotted-lines          Do not use dotted lines in the toc
      --toc-header-text <text>        The header text of the toc (default Table
                                      of Contents)
      --toc-level-indentation <width> For each level of headings in the toc
                                      indent by this length (default 1em)
      --disable-toc-links             Do not link from toc to sections
      --toc-text-size-shrink <real>   For each level of headings in the toc the
                                      font is scaled by this factor (default
                                      0.8)
      --xsl-style-sheet <file>        Use the supplied xsl style sheet for
                                      printing the table of content

Quelle: http://wkhtmltopdf.org/usage/wkhtmltopdf.txt

java-wkhtmltopdf-wrapper

Dank der Zuhilfenahme des wkhtmltopdf-wrappers, welchen ich in mein Projekt eingebunden habe, durch die Einbindung der Maven-Dependency, ist es nun recht mühelos mit wkhtmltopdf aus Java heraus zu arbeiten. Am einfachsten ist es, denke ich, an einem Codebeispiel mit Kommentaren zu erkennen:

import java.io.IOException;
import com.github.jhonnymertz.wkhtmltopdf.wrapper.Pdf;
import com.github.jhonnymertz.wkhtmltopdf.wrapper.configurations.WrapperConfig;
import com.github.jhonnymertz.wkhtmltopdf.wrapper.page.PageType;
import com.github.jhonnymertz.wkhtmltopdf.wrapper.params.Param;

public class WkhtmltopdfTest {
 public static void main( String[] args ) { 
  // Erzeugen eines neuen Pdf Objekts als Parameter wir eine WrapperConfig übergeben, die den Pfad der wkhtmltopdf.exe definiert.
  Pdf pdf = new Pdf(new WrapperConfig("C:\\Program Files\\wkhtmltopdf\\bin\\wkhtmltopdf.exe"));
  //Hinzufügen einer test HTML-Datei und Festlegung auf den Typ File aus dem Enum PageType
  pdf.addPage( "C:\\test\\test.html", PageType.file );
  //Hinzufügen diverser Parameter wie Format, Orientierung und Randgröße
  pdf.addParam( new Param( "-s", "A6" ), new Param( "-O", "landscape" ),
                new Param( "-B", "0" ), new Param( "-R", "0" ),
                new Param( "-T", "0" ), new Param( "-L", "0" ) );
  try {
   //Speichern der PDF-Datei unter dem angebenen Pfad
   pdf.saveAs( "C:\\test\\test.pdf" );
  }
  catch ( IOException | InterruptedException e ) {
   e.printStackTrace();
  }
 }
}

Dieses Programm erzeugt aus einer HTML-Datei mit dem Namen “test.html“, welche im Ordner “C:\test\“ liegt, eine “test.pdf“ im selben Verzeichnis.

Autor: André Fischer

Von char in int: vom Zeichen zur Zahl

Wenn Zeichen aus Benutzereingaben stammen stellt sich die Anforderung, diese in die Zahl zu konvertieren. Aus der Ziffer ‚5‘ soll das der numerische Wert 5 folgen. Nach alter Hacker-Tradition war die Lösung immer die, eine ‚0‘ abzuziehen. Die ASCII-Null ‚0‘ hat den char-Wert 48, ‚1‘ dann 49, bis ‚9‘ schließlich 57 erreicht. So ist logischerweise ‚5‘ – ‚0‘ = 53 – 48 = 5. Die Lösung hat einen Nachteil, dass sie nur für ASCII-Ziffern funktioniert.

Eine ordentliche Java-Lösung besteht zum Beispiel darin, ein char in ein String zu konvertieren und diesen über eine Integer-Methode zu konvertieren, etwa so:

char c = '5';

int  i = Integer.parseInt( String.valueOf(c) );  // 5

Die parseInt(…)-Methode ist voll internationalisiert und konvertiert ebenso Dezimalzahlen aus anderen Schriftsystemen, etwa Hindi/Sanskrit:

System.out.println( Integer.parseInt( "५" ) );   // 5

Das funktioniert, ist jedoch für einzelne Zeichen nicht besonders effizient in Schleifen. Es gibt zwei andere Möglichkeiten, mit statischen Methoden aus der Klasse Character.

getNumericValue(…)-Methode

Die Character-Methode getNumericValue(char) liefert den numerischen Wert einer Ziffer zurück; natürlich arbeitet die Methode wieder internationalisiert:

int i = Character.getNumericValue( '5' );

System.out.println( i );                         // 5

System.out.println( Integer.parseInt( "५" ) );   // 5

Die Methode ist viel leistungsfähiger, denn sie kennt den tatsächlichen „Wert“ aller Unicode-Zeichen. Zum Beispiel auch der römischen Ziffern Ⅰ, Ⅱ, Ⅲ, Ⅳ, Ⅴ, Ⅵ, Ⅶ, Ⅷ, Ⅸ, Ⅹ, Ⅺ, Ⅻ, Ⅼ, Ⅽ, Ⅾ, Ⅿ, …, die im Unicode-Alphabet ab ‚\u2160‘ stehen:

System.out.println( Character.getNumericValue( '\u216f' ) ); // 1000

XXXdigit(…)-Methoden

Die Character-Klasse besitzt ebenso eine Umwandlungsmethode für Ziffern bezüglich einer beliebigen Basis, das auch in die andere Richtung.

final class java.lang.Character
implements Serializable, Comparable<Character>

  • staticintdigit(charch,intradix)
    Liefert den numerischen Wert, den das Zeichen ch unter der Basis radix Beispielsweise ist Character.digit(‚f‘, 16) gleich 15. Erlaubt ist jedes Zahlensystem mit einer Basis zwischen Character.MIN_RADIX (2) und Character.MAX_RADIX (36). Ist keine Umwandlung möglich, beträgt der Rückgabewert –1.
  • staticcharforDigit(intdigit,intradix)
    Konvertiert einen numerischen Wert in ein Zeichen. Beispielsweise ist forDigit(6, 8) gleich „6“ und Character.forDigit(12, 16) ist „c“.

Beispiel: Konvertiere eine Zeichenkette mit Ziffern in eine Ganzzahl.

 char[] chars = { '3', '4', '0' };
 int result = 0;
 for ( char c : chars ) {
   result = result * 10 + Character.digit( c, 10 );
   System.out.println( result );
 }

Die Ausgabe ist 3, 34 und 340.

 

Statischer Import

Die import-Deklaration informiert den Compiler über die Pakete, sodass ein Typ nicht mehr voll qualifiziert werden muss, wenn er im import-Teil explizit aufgeführt wird oder wenn das Paket des Typs über * genannt ist.

Falls eine Klasse statische Methoden oder Konstanten vorschreibt, werden ihre Eigenschaften immer über den Typnamen angesprochen. Java bietet mit dem statischen Import die Möglichkeit, die statischen Methoden oder Variablen ohne vorangestellten Typnamen sofort zu nutzen. Während also das normale import dem Compiler Typen benennt, macht ein statisches import dem Compiler Klasseneigenschaften bekannt, geht also eine Ebene tiefer.

Beispiel: Binde für die Bildschirmausgabe die statische Variable out aus System statisch ein:

import static java.lang.System.out;

Bei der sonst üblichen Ausgabe über System.out.printXXX(…) kann nach dem statischen Import der Klassenname entfallen, und es bleibt beim out.printXXX(…)

Bilden wir in einem Beispiel mehrere statische Eigenschaften mit einem statischem import ein:

 import static java.lang.System.out;
 import static javax.swing.JOptionPane.showInputDialog;
 import static java.lang.Integer.parseInt;
 import static java.lang.Math.max;
 import static java.lang.Math.min;
 
 class StaticImport {
 
   public static void main( String[] args ) {
     int i = parseInt( showInputDialog( "Erste Zahl" ) );
     int j = parseInt( showInputDialog( "Zweite Zahl" ) );
     out.printf( "%d ist größer oder gleich %d.%n",
                 max(i, j), min(i, j)  );
   }
 }

Mehrere Typen statisch importieren

Der statische Import

import static java.lang.Math.max;
import static java.lang.Math.min;

bindet die statische max(…)/min(…)-Methode ein. Besteht Bedarf an weiteren statischen Methoden, gibt es neben der individuellen Aufzählung eine Wildcard-Variante:

import static java.lang.Math.*;

Best Practice: Auch wenn Java diese Möglichkeit bietet, sollte der Einsatz maßvoll erfolgen. Die Möglichkeit der statischen Importe ist nützlich, wenn Klassen Konstanten nutzen wollen, allerdings besteht auch die Gefahr, dass durch den fehlenden Typnamen nicht mehr sichtbar ist, woher die Eigenschaft eigentlich kommt und welche Abhängigkeit sich damit aufbaut. Auch gibt es Probleme mit gleichlautenden Methoden: Eine Methode aus der eigenen Klasse überdeckt statische importierte Methoden. Wenn also später in der eigenen Klasse – oder Oberklasse – eine Methode aufgenommen wird, die die gleiche Signatur hat wie eine statisch importierte Methode, wird das zu keinem Compilerfehler führen, sondern sich die Semantik ändern, weil jetzt die neue eigene Methode verwendet wird, und nicht mehr die statisch importierte.

Eclipse 4.7 M3 (Oxygen)

Alle Neuigkeiten unter https://www.eclipse.org/eclipse/news/4.7/M3/.

Für mich interessanter sind:

Ctrl+E command improvements You can use the Quick Switch Editor (Ctrl+E) command to list and filter all the open editors. This works now also if you have selected a view in the editor area. You can filter the list using wildcards, and select editors using mouse or keyboard.Now you can also cycle through the list by pressing Ctrl+E again. Or use Arrow Up/Down as before.

Na endlich:

Escape text when pasting into a string literal The Java > Editor > Typing > Escape text when pasting into a string literalpreference option is now enabled by default. This will escape the special characters in pasted strings when they are pasted into an existing string literal.

To paste without escaping, you can either paste outside of a string literal, or you can disable Edit > Smart Insert Mode.

Initialisierung von Klassenvariablen

Wo werden eigentlich Klassenvariablen initialisiert? Im Konstruktor ergibt dies keinen Sinn, da für Klassenvariablen keine Objekte angelegt werden müssen. Dafür gibt es den static{}-Block. Dieser wird immer dann ausgeführt, wenn der Klassenlader eine Klasse in die Laufzeitumgebung geladen hat. Für eine statische Initialisierung wird also wieder der Compiler etwas einfügen:

Was wir schreiben Was der Compiler generiert
class Beer {
static String isFreeFor = „Homer“;
}
class Beer {
static String isFreeFor;
static {
isFreeFor = „Homer“;
}
}

Klassenintialisierer sind nicht ganz ungefährlich, denn wenn der Code eine Ausnahme auslöst, dann gibt es einen harten lang.ExceptionInInitializerError. Leser können das testen, in dem geändert wird:

static String isFreeFor = „Homer“.substring( -1 );

und dann aus dem Hauptprogramm aufrufen:

out.println( Beer.isFreeFor );

Aufgebaute Exemplare mitzählen

Ein Konstruktor soll die Anzahl der erzeugten Objekte mitzählt; eine statische Methode liefert später die bis dahin gebauten Exemplare:

public class Rollercoaster {




  private static int numberOfInstances;




  {

    numberOfInstances++;

  }




  public static int getNumberOfInstances() {

    return numberOfInstances;

  }




  public static void main( String[] args ) {

    new Rollercoaster();

    new Rollercoaster();




    System.out.println( Rollercoaster.getNumberOfInstances() ); // 2

  }

}

Die statische Variable numberOfInstances wird bei jedem neuen Exemplar über den Konstruktor hochgesetzt. Direkt ausgeschrieben ist der Konstruktor nicht, sondern es findet ein Exemplarinitialisierer Anwendung, da der Compiler den Code automatisch in jeden Konstruktor kopiert. Das hat den Vorteil, dass Entwickler später problemlos neue Konstuktoren für den Rollercoaster hinzufügen können, ohne das Inkrement der statischen Variable immer im Hinterkopf behalten zu müssen.

Hinweis: Bei nebenläufigen Zugriffen auf statische Variablen kann es zu Problemen kommen. Deshalb müssen wir spezielle Synchronisationsmechanismen nutzen – die das Beispiel allerdings nicht verwendet. Statische Variablen können auch schnell zu Speicherproblemen führen, da Objektreferenzen sehr lange gehalten werden. Der Einsatz muss wohldurchdacht sein.

Eclipse Oxygen (4.7) M2 Neuigkeiten

Alle Neuigkeiten unter https://www.eclipse.org/eclipse/news/4.7/M2/.

Für mich als Java-Programmierer ist eignetlich nur das interessant:

Method result after step operations During debugging, the last method result (per return or throw) that was observed duringStep Into, Step Over or Step Return, is shown as first line in the Variables view.

This can be disabled with the new option Preferences > Java > Debug > Show method result after a step operation (if supported by the VM; may be slow)

Release Date für das GA:  Wednesday, June 28, 2017

GWT 2.8.0 ist raus

Details zu den Änderungen unter http://www.gwtproject.org/release-notes.html. Toll ist die Unterstützung von Java 8.

  • Started using ES6 Maps when available for HashMap/HashSet that yields up 3x performance improvements.
  • Partial support for Java 8 standard library APIs (see below for full list).
  • Source level set to Java 8.
  • Static and default methods in interfaces aren’t visible to generators. If you want to take advantage of those Java-8isms, you’re encouraged to switch to an annotation processor. This could break existing build if an interface is changed to turn a non-default method into a default method.
  • Emulate java.io.UncheckedIOException.
  • Emulate Optional<T> and its int, long, double variants.
  • Emulate Objects.requireNonNull() with message Supplier.
  • Fix Math.min/max(float/double) emulation behavior.
  • Emulate Character.isBmpCodePoint().
  • Emulate CharSequence.chars().
  • Emulate java.lang.SecurityException.
  • Emulate Java 8 API of
  • java.util.Arrays,
  • java.util.ArrayDeque,
  • java.math.BigInteger,
  • java.util.BitSet,
  • java.util.Comparator,
  • java.util.function,
  • java.util.Iterator,
  • java.lang.Iterable,
  • java.util.IntSummaryStatistics/LongSummaryStatistics/DoubleSummaryStatistics
  • java.util.Collection/Lists/Queues,
  • java.util.Map,
  • java.util.logging.Logger,
  • java.util.PrimitiveIterator,
  • java.util.Spliterator,
  • java.util.stream,
  • java.util.StringJoiner

Termine 2016 öffentlicher Seminare (Java 8)

JavaServer Pages (JSP) und Servlets (›JSP‹)

Das JSP/Servlet-Seminar vermittelt den Aufbau dynamische Webseiten mit der JSP und Servlet Technologie. JavaServer Pages (JSP) übernehmen bei der Trennung von Visualisierung und Applikationscode die Darstellung, JavaBeans die Daten und Logik. Das Protokoll …

In Dortmund 23.11.-25.11.2016

Java 8 Neuerungen (›JAVA8‹)

Java 8 bringt große Änderungen an der Sprache mit sich, die die Programmierung deutlich beeinflusst. Die größte Sprachänderungen von Java 8 betreffen Lambda-Ausdrücke, dazu gesellen sich Default-Methoden und statische Schnittstellenmethoden. Teilnehmer …

In Dortmund als Eintagesschulung am 21.11.2016

Java Grundlagen (›JAVA1‹)

Durch ihre Plattformunabhängigkeit sind Java-Programme auf unterschiedlichen Computersystemen ablauffähig. Ihre hohe Performanz und Robustheit macht Java zu einer beliebten Sprache für kritische Serverkomponenten. In diesem Seminar lernen die Teilnehmer …

In Dortmund KW 46 14.11.-18.11.2016 und wieder in 2017

Der Kurs richtet sich an Teilnehmer, die bereits Erfahrung in der objektorientierten Programmiersprache C++ haben und jetzt die Eigenschaften von Java kennen lernen wollen. Mit den leistungsfähigen Bibliotheken lernen die Teilnehmer nebenläufige Programme …

In Dortmund vom 07.11.-11.11.2016 (KW 45) zusammen mit dem Seminar Java für C#-Programmierer

Java für C#-Programmierer (›CS2JAVA‹)

Der Kurs richtet sich an Teilnehmer, die bereits Erfahrung in der objektorientierten Programmiersprache C# und dem .NET-Framework haben und jetzt die Eigenschaften von Java kennen lernen wollen. Mit den leistungsfähigen Java-Bibliotheken lernen die Teilnehmer …

In Dortmund vom 07.11.-11.11.2016 (KW 45) zusammen mit dem Seminar Java für C++-Programmierer