JDK 7 „Diamanten sind für immer“

In Java 7 gibt es jetzt den „diamond Operator“. Nun müssen bei generics keine Typen doppelt deklariert werden.

Hier ein Beispiel vorher und nachher:

List<Integer> liste = new ArrayList<Integer>(); // vor JRE 7

List<Integer> diamantListe = new ArrayList<>(); // ab JRE 7, ja Diamonds are forever

Java 7 ist DA!

So, jetzt ist Java 7 da. Was braucht man zum ausprobieren?

Eine Eclipse Version die Java 7 unterstützt. Das geht noch nicht mit Helios. Deshalb einen „Nightly Build“ herunterladen.
Dann über Update neue Software über diese URL den JDK 7 patch herunterladen.

Was dann noch fehlt ist das JDK 7 von Oracle.

In den Projekt Einstellungen unter Java Compiler die 1.7 auswählen und nun der erste Test.

In Java 1.7 sind jetzt Unterstriche (_) in Literalen möglich, um besser zu gliedern z.B.

Das Ergebnis:
Telefonnummer 1: 11223344
Telefonnummer 2: 1122.33

Weitere Neuerungen mit Beispielen wie „String in switch“ kommen hier dann demnächst.

Eclipse 3.7 da!

Ab jetzt gibt es eine neue Eclipse 3.7 Version genannt Indigo. Mal sehen was es neues gibt. Download über die Eclipse Seite.

Habe das Java Package geladen, und das erste Projekt ins Git Repo geschoben.
Die Home Variable war nicht gesetzt auf das User Verzeichnis, dann lief es.
Hier die EGit-Anleitung.

Maven, da musste ich in den Settings auch die setting.xml setzen, und im Pom einige Goals auskommentiern, da sie mit der neuen Version nicht zusammen passen.

Das Explorer-Plugin läuft auch unter Indigo, super.

Indigo scheint auch schneller zu laufen 🙂

Bedingungen einkapseln

Da boolesche Logik auf den ersten Blick schwer lesbar und zu verstehen ist,

können (sollten) Funktionen extrahiert werden um eine bessere Lesbarkeit zu erhalten.

Z.B.

if (sollGeloeschtWerden(timer)){…

ist besser als:

if (timer.isGueltige() && !timer.isAktuell() || timer > heute){…

Wieviele Argumente sollte eine Methode haben?

Ideal ldt. Robert C. Martin (Clean Code, 2009) „ist null (niladisch).

Als nächstes kommt eins (monadisch), dicht gefolgt von zwei (dyadisch).

Drei Argumente (triadisch), sollte wenn möglich, vermieden werden.

Mehr als drei (polyadisch) erfordert eine sehr spezielle Begründung – und sollte dann trotzdem nicht benutzt werden.“

Das sehe ich auch so.

Und Ihr?

Threads mit asynchron Rückgabe über Callable

Um einen neuen Thread zu starten der ein Ergebniss asynchron liefert, gibt es seit Java 1.5 die Schnittstelle Callable.

Was muss getan werden?

-Die Klasse mit dem Ergebniss muss Callableimplementieren und V call() throws Exception überschreiben.

-Evl. im Konstruktor der Ergebniss Klasse Parameter mitgeben.

-Dann den Excecutor anlegen ExecutorService executor = Executors.newCachedThreadPool();

-Einen neuen Überwachungs Thread starten mit Future erg = executor.submit(ergebnisKlasse).
Würde man Future erg = executor.submit(u).get() verwenden würde eine synchrone abarbeitung des Threads erfolgen. Das heißt es würde die weitere Bearbeitung solange geblockt, bis der Thread fertig ist.

-Mit erg.get(1, TimeUnit.SECONDS) wird das Ergebnis des Threads geliefert oder aber wenn die angegebenen Zeit abgelaufen ist wird
eine TimeoutException geworfen.

-Mit erg.isDone() kann abgefragt werden ob der Thread fertig ist oder nicht

Wie sieht eine gute API aus?

Gem. Joshua Bloch „If in doubt, leave it out!“.

Das heißt soviel wie, nur Methoden in eine API aufnehmen, von denen man sicher ist, dass sie auch benötigt werden. Methoden für die man kein verwender hat, sollte man nicht mit aufnehmen. Den Neues kann man leicht
hinzufügen, Bestehendes aber nicht so leicht verändert oder entfernen. Also sich auf das konzentrieren, was
in den Anforderungen gebraucht wird. Sonst wird das System unnötig komplex.

Siehe diesen Video bei ca. 24 min.

Generische Methoden

Das einzig seltsame an generischen Methoden ist, das die Type Variable (hier T) vor dem return Typ der Methode deklariert werden muss.

Hier ein Beispiel mit der getKlassenname Methode, die für alle Objekte den Klassennamen als String zurück gibt.

public class GenericMethods {

public static < T > String getKlassenname(T t) {

return t.getClass().getName();
}

public static void main(String[] args) {

System.out.println(GenericMethods.getKlassenname(new Integer(1)));

System.out.println(GenericMethods.getKlassenname("String"));

System.out.println(GenericMethods.getKlassenname(new ArrayList()));
}
}


Wie sieht das Ergebnis aus? „Generische Methoden“ weiterlesen

UML Komposition

Eine Komposition ist ein Sonderfall der Aggregation, er beschreibt die Beziehung zwischen einem Ganzen und seinen Teilen. Ein Teil kann immer nur genau einem Ganzen zugeordnet sein.

In UML kann eine Komposition die an der ausgefüllten Raute am Ganzen, so dargestellt werden:

Eine Komposition in Java kann wie folgt erstellt werden „UML Komposition“ weiterlesen