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

Java SE Embedded Compact Profiles

Hat ein System beschränkten Speicher, wird es knapp für das gesamte Java SE. Daher gibt es Teilmengen der Java SE, genannt Profiles, die nur knapp über 11 MiB benötigen. Im Moment gibt es drei Profile, also drei Teilmengen der Java SE, die jeweils immer etwas mehr können. compact1 ist die kleinste Teilmenge, wo zum Beispiel die Kernklassen enthalten sind, compact2 nimmt die API für Datenbankverbindungen mit auf, compact3 kann dann XML-Verarbeitung und die komplette Java SE grafische Oberflächen darstellen oder Web-Services deklarieren.

Jede Klasse ist einem Profil zugeordnet, was der Compiler statisch prüfen kann – solange der Klassenname nicht dynamisch bestimmt wird. So lässt sich sicherstellen, dass nur Typen referenziert werden, die auch in einem Profil sind.

Oracle Java Standard Edition Embedded (Oracle Java SE Embedded)

Oracle unterstützt mit der Oracle Java Standard Edition Embedded (Oracle Java SE Embedded)[1] Profile. Allerdings laden Entwickler keine einfache Laufzeiumgebung herunter, sondern ein Werkzeug JRECreate, mit dem eine Laufzeitumgebung mit unseren eigenen Paketen für ein bestimmtes System generiert wird. Drei Laufzeitumgebungen sind wählbar: eine Minimal-JVM, Client JVM (schnelle Reaktionsfähigkeit), Server JVM (verbraucht mehr Hauptspeicher). Sehr fein kann dann bestimmt werden, ob JavaFX mit dabei sein soll, oder welche Sprachübersetzungen mit ausgeliefert werden. Am Ende steht ein Verzeichnis mit bin und JRE, lib und Java-Archiven, Konfigurationen und – das darf bei Oracle auf keinen Fall fehlen – Copyright- und Lizenz-Dokumenten.

[1]      http://www.oracle.com/technetwork/java/embedded/embedded-se/downloads/index.html

Eclipse 4.6 (Neon) News

Alle News unter https://www.eclipse.org/eclipse/news/4.6/platform.php.

Interessant sind:

Commands and shortcuts to zoom in text editors In text editors, you can now use Zoom In (Ctrl++ or Ctrl+=) and Zoom Out (Ctrl+-) commands to increase and decrease the font size.Like a change in the General > Appearance > Colors and Fonts preference page, the commands persistently change the font size in all editors of the same type. If the editor type’s font is configured to use a default font, then that default font will be zoomed.
Full Screen The Full Screen feature is now also available on Windows and Linux. You can toggle the mode via shortcut (Alt+F11) or menu (Window > Appearance > Toggle Full Screen).When Full Screen is activated, you’ll see a dialog which tells you how to turn it off again.

On the Mac, Window > Toggle Full Screen (Control+Command+F) still works as before.

Substring code completion Content Assist now supports substring patterns. Enter any part of the desired proposal’s text, and Content Assist will find it! For example, completing on selection proposes all results containing selection as a substring.Popup with proposals like addSelectionListener(..), getSelection(), etc.

This feature can be disabled using the Show substring matches option on the Java > Editor > Content Assist preference page.

Clean Up to remove redundant type arguments A new option to remove redundant type arguments has been added under the „Unnecessary Code“ group of the Clean Up profile.
Create new fields from method parameters You can now assign all parameters of a method or constructor to new fields at once using a newQuick Assist (Ctrl+1):Assign all parameters to new fields
Quick Fix to configure problem severity You can now configure the severity of a compiler problem by invoking the new Quick Fix (Ctrl+1) which opens the Java > Compiler > Errors/Warnings preference page and highlights the configurable problem.

The Quick Fix icon may look familiar to you. In older Eclipse versions, this was a toolbar button in enriched hovers (i.e., you had to press F2 or move the mouse into the hover to see it).

 

 

 

Boolean nach Ganzzahl konvertieren

Der primitive Typ boolean lässt sich nicht über eine Typumwandlung in einen anderen primitiven Typ konvertieren. Doch in der Praxis kommt es vor, dass true auf 1 und false auf 0 abgebildet werden muss; der übliche Weg ist:

int val = aBoolean ? 1 : 0;

Exotischer ist:

int val = Boolean.compare( aBoolean, false );

Noch exotischer folgendes:

int val = 1 & Boolean.hashCode( true ) >> 1;