<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>zeroseven labs &#187; Java</title>
	<atom:link href="http://labs.zeroseven.de/category/development/java/feed/" rel="self" type="application/rss+xml" />
	<link>http://labs.zeroseven.de</link>
	<description></description>
	<lastBuildDate>Wed, 28 Jul 2010 07:43:22 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Prevayler: Eine effiziente Lösung für die Serialisierung von Objekten</title>
		<link>http://labs.zeroseven.de/development/java/prevayler-eine-effiziente-losung-fur-die-serialisierung-von-objekten/</link>
		<comments>http://labs.zeroseven.de/development/java/prevayler-eine-effiziente-losung-fur-die-serialisierung-von-objekten/#comments</comments>
		<pubDate>Fri, 19 Sep 2008 08:36:57 +0000</pubDate>
		<dc:creator>frankl</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Persistenz]]></category>
		<category><![CDATA[Prevayler]]></category>
		<category><![CDATA[Serialisierung]]></category>

		<guid isPermaLink="false">http://labs.zeroseven.de/?p=560</guid>
		<description><![CDATA[Im Alltag eines Java-Programmierers ist man oft auf die Möglichkeit der Sicherung von Objekten, über die Ausführungszeit einer Anwendung hinaus, angewiesen. Dies kann mittels Persistenz (Speicherung von Objekten auf nicht flüchtigen Speichermedien), gewährleistet werden.

Beispiele für entsprechende Anwendungsfälle sind leicht zu finden. So kann dies beim Beenden einer Anwendung verwendet werden, um diese nach einem Neustart [...]]]></description>
			<content:encoded><![CDATA[<p>Im Alltag eines Java-Programmierers ist man oft auf die Möglichkeit der Sicherung von Objekten, über die Ausführungszeit einer Anwendung hinaus, angewiesen. Dies kann mittels Persistenz (Speicherung von Objekten auf nicht flüchtigen Speichermedien), gewährleistet werden.</p>
<p><span id="more-560"></span></p>
<p>Beispiele für entsprechende Anwendungsfälle sind leicht zu finden. So kann dies beim Beenden einer Anwendung verwendet werden, um diese nach einem Neustart wiederherstellen, oder im Fehlerfall einen auftretenden Fehler rekonstruieren zu können.</p>
<p>Diese zwei Beispiele zeigen, wie wichtig die Serialisierung von Objekten sein kann.</p>
<p>Für dessen Realisierung stehen dem Programmierer neben der Java-Schnittstelle Serializable, noch  entsprechende externe Bibliotheken zur Verfügung. Ein sehr interessanter Vertreter der Kategorie &#8220;Bibliotheken&#8221;, der zugleich frei Verfügbar ist, stellt Prevayler dar. Der neben seiner beeindruckenden Performance, noch Fehlertoleranz und Load-Balancing unterstützt. Dabei unterhält er nicht, wie andere Persistenz-Layer (z.B. Hibernate), die Daten der Objekte in einer relationalen Datenbanken, sondern im Arbeitsspeicher und sichert die Objekte in bestimmten Intervallen auf der Festplatte.</p>
<p>Wer sich für dieses Thema interessiert und auf Persistenz angewiesen ist, wird in Prevayler kein Allheilmittel finden, aber einen guten Verbündeten für eine einfache und vor allem performante Umsetzung in eigenen Projekten.</p>
<p>Offizielle Projekt-Homepage: <a href="http://www.prevayler.org" target="_blank">http://www.prevayler.org</a></p>
]]></content:encoded>
			<wfw:commentRss>http://labs.zeroseven.de/development/java/prevayler-eine-effiziente-losung-fur-die-serialisierung-von-objekten/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Unit Testing in Java Teil 3: JUnit&#8217;s Testmethoden</title>
		<link>http://labs.zeroseven.de/development/java/unit-testing-in-java-teil-3-junits-testmethoden/</link>
		<comments>http://labs.zeroseven.de/development/java/unit-testing-in-java-teil-3-junits-testmethoden/#comments</comments>
		<pubDate>Fri, 05 Sep 2008 07:26:04 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[assertEquals]]></category>
		<category><![CDATA[assertSame]]></category>
		<category><![CDATA[assertTrue]]></category>
		<category><![CDATA[fail]]></category>
		<category><![CDATA[Funktionen]]></category>
		<category><![CDATA[JUnit]]></category>

		<guid isPermaLink="false">http://labs.zeroseven.de/?p=511</guid>
		<description><![CDATA[Letzte Woche haben wir ein einfaches Beispiel zur Demonstration von JUnit erstellt. Heute wollen wir uns die Testmethoden anschauen, welche JUnit schon von Haus aus mitbringt. Diese Methoden werden Assertions benannt, vielleicht dem einen oder anderen ein schon bekannter Ausdruck von anderen Programmiersprachen. Im Englischen bedeutet das Wort to assert soviel wie behaupten, feststellen oder [...]]]></description>
			<content:encoded><![CDATA[<p><a title="JUnit in Java Teil 2" href="http://labs.zeroseven.de/2008/08/unit-testing-in-java-teil-2-ein-einfaches-beispiel/" target="_blank">Letzte Woche</a> haben wir ein einfaches Beispiel zur Demonstration von JUnit erstellt. Heute wollen wir uns die Testmethoden anschauen, welche JUnit schon von Haus aus mitbringt. Diese Methoden werden Assertions benannt, vielleicht dem einen oder anderen ein schon bekannter Ausdruck von anderen Programmiersprachen. Im Englischen bedeutet das Wort <em>to assert </em>soviel wie behaupten, feststellen oder versichern. Wir stellen also fest, das eine gewisse Bedingung eintrifft.</p>
<p><span id="more-511"></span></p>
<p>Alle Assertions in JUnit beginnen mit dem Schlüsselwort assert, folgende stehen uns dabei zu Verfügung:</p>
<ul>
<li>assertEquals</li>
<li>assertNull</li>
<li>assertSame</li>
<li>assertTrue</li>
<li>assertArrayEquals</li>
</ul>
<p>Analog zu diesen Funktionen gibt es auch die entsprechenden negierenden Funktionen</p>
<ul>
<li>assertNotNull</li>
<li>assertNotSame</li>
<li>assertFalse</li>
</ul>
<p>Die einzelnen Funktionen befinden sich alle in der Klasse Assert im Paket junit.framework. Neuere Funktionen befinden sich in org.junit. Die JavaDoc zu Junit kann man auf der <a title="Junit API JavaDoc" href="http://junit.org/junit/javadoc/4.5/" target="_blank">offiziellen Website von JUnit</a> finden.</p>
<p><strong>static void assertEquals([String message], expected, actual)</strong></p>
<p>assertEquals wird am Häufigsten verwendet. Die Funktion überprüft ob der Erwartungswert <em>expected</em> dem tatsächlichen Wert <em>actual</em> entspricht. Der Test schlägt fehl, wenn sich die beiden Werte gleichen. Möchte man eine eigene Nachricht definieren, welche bei Fehlschlagen des Tests angezeigt wird, so kann man das über den optionalen Parameter <em>message </em>angeben. Die Parameter <em>expected</em> und <em>actual</em> können beliebige Datentypen aufnehmen, von primitiven Datentypen wie int oder boolean bis zu allen Objekten die in Java erstellt werden. Werden Arrays miteinander verglichen wird nicht der Inhalt der Arrays, sondern lediglich die Referenz auf die Arrays zum Vergleich verwendet.</p>
<p><strong>static void assertEquals([String message], expected, actual, tolerance)</strong></p>
<p>Eine Besonderheit stellt der Vergleich von Fließkommazahlen dar, da mit ihnen nicht immer exakte Werte verglichen werden können. Das wird hauptsächlich durch die begrenzte Anzahl von Dezimalstellen nach dem Komma und den nach sich ziehenden Rundungs- und Berechnungsfehlern verursacht. Zum Ausgleich bietet asserEquals den Wert <em>tolerance</em> an, welcher die Genauigkeit nach dem Komma angibt. Gibt man für <em>tolerance</em> zum Beispiel den Wert 0.001 an, dann werden nur die letzten 3 Stellen nach dem Komma berücksichtigt. 0.01 wären 2 Stellen 0.000001 wären 6 Stellen.</p>
<p><strong>static void asserNull([String message], java.lang.Object object)</strong></p>
<p>assertNull überprüft ob ein Objekt null ist. Wie auch bei den anderen Assertions kann eine benutzerdefinierte Nachricht über den optionalen Parameter <em>message</em> angegeben werden. Analog dazu gibt es die Methode assertNotNull, welche überprüft ob das übergebene Objekt nicht null ist.</p>
<p><strong>static void assertSame([String message], expected, actual)</strong></p>
<p>Diese Methode überprüft ob zwei Objeke gleich sind. Dabei wird nicht überprüft ob die Inhalte, sondern ob die Objekttypen übereinstimmen. Wie auch bei assertNull das Gegenteil mit assertNotNull getestet werden kann, gibt es für diese Funktion den Gegenspieler asserNotSame.</p>
<p><strong>static void assertTrue([String message], boolean condition)</strong></p>
<p>Hier wird geprüft ob die Bedingung <em>condition</em> true ergibt. Das kann ein arithmetischer Ausdruck sein, aber auch ein Funktionsaufruf. Der Gegenspieler hierzu ist assertFalse, welcher (Überraschung) überprüft ob die angegebene Bedingung false ergibt. <em>message</em> ist, wie bei den vorherigen Funktionen, wieder der optionale Parameter mit welchem man eine benutzerdefinierte Nachricht angeben kann.</p>
<p><strong>static void assertArrayEquals([String message], expecteds, actuals)</strong></p>
<p>Wie schon erwähnt ist es nicht möglich die Inhalte von Arrays über die Funktion assertEquals zu vergleichen. Dafür gibt es die Funktion assertArrayEquals. Diese funktioniert genau gleich wie assertEquals, vergleicht jedoch die einzelnen Inhalte der Arrays. Diese Funktion steht erst ab Version 4.3 der JUnit API zur Verfügung.</p>
<p><strong>static void fail([String message])</strong></p>
<p>Eigentlich ist diese Funktion nicht wirklich eine Assertion, da keine Werte getestet werden. Der Test schlägt mit dieser Methode automatisch fehl und wird häufig dazu verwendet um Zweige des Programms zu testen, welche eigentlich nie erreicht werden dürften.</p>
<p>Mit diesen Funktionen als Handwerkszeug sind die meisten Testfälle abgedeckt. Im nächsten Teil der Serie werden wir Best Practices und wie getestet werden sollte besprechen.</p>
]]></content:encoded>
			<wfw:commentRss>http://labs.zeroseven.de/development/java/unit-testing-in-java-teil-3-junits-testmethoden/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Unit Testing in Java Teil 2: Ein Einfaches Beispiel</title>
		<link>http://labs.zeroseven.de/development/java/unit-testing-in-java-teil-2-ein-einfaches-beispiel/</link>
		<comments>http://labs.zeroseven.de/development/java/unit-testing-in-java-teil-2-ein-einfaches-beispiel/#comments</comments>
		<pubDate>Fri, 29 Aug 2008 12:55:17 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Beispiel]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[JUnit]]></category>
		<category><![CDATA[Softwareentwicklung]]></category>
		<category><![CDATA[Unit Testing]]></category>

		<guid isPermaLink="false">http://labs.zeroseven.de/?p=440</guid>
		<description><![CDATA[In Teil 1 des Unit Testing Tutorials habe ich erklärt wie Unit Tests funktionieren. Um das an einem einfachen Beispiel zu vertiefen, schreiben wir unseren ersten eigenen Unit Test. JUnit ist in Eclipse schon vorhanden und muss lediglich beim Erstellen eines Projekts als Bibliothek importiert werden.

Schritt 1: Erstellen eines JUnit-Projekts in Eclipse
Erstellen Sie ein neues [...]]]></description>
			<content:encoded><![CDATA[<p>In <a href="http://labs.zeroseven.de/2008/08/unit-testing-in-java-teil-1-grundlagen/">Teil 1 des Unit Testing Tutorials</a> habe ich erklärt wie Unit Tests funktionieren. Um das an einem einfachen Beispiel zu vertiefen, schreiben wir unseren ersten eigenen Unit Test. JUnit ist in Eclipse schon vorhanden und muss lediglich beim Erstellen eines Projekts als Bibliothek importiert werden.</p>
<p><span id="more-440"></span></p>
<p><strong>Schritt 1: Erstellen eines JUnit-Projekts in Eclipse</strong></p>
<div id="attachment_441" class="wp-caption alignright" style="width: 94px"><a href="http://labs.zeroseven.de/wp-content/uploads/2008/08/bild-4.png" rel="lightbox[440]"><img class="size-thumbnail wp-image-441" src="http://labs.zeroseven.de/wp-content/uploads/2008/08/bild-4-150x150.png" alt="Neues Projekt erstellen" width="84" height="84" /></a><p class="wp-caption-text">Abbildung 1: Neues Projekt erstellen</p></div>
<div id="attachment_444" class="wp-caption alignright" style="width: 94px"><a href="http://labs.zeroseven.de/wp-content/uploads/2008/08/bild-5.png" rel="lightbox[440]"><img class="size-thumbnail wp-image-444" src="http://labs.zeroseven.de/wp-content/uploads/2008/08/bild-5-150x150.png" alt="Build Einstellungen" width="84" height="84" /></a><p class="wp-caption-text">Abbildung 2: Build Einstellungen</p></div>
<div id="attachment_447" class="wp-caption alignright" style="width: 94px"><a href="http://labs.zeroseven.de/wp-content/uploads/2008/08/bild-6.png" rel="lightbox[440]"><img class="size-thumbnail wp-image-447" src="http://labs.zeroseven.de/wp-content/uploads/2008/08/bild-6-150x150.png" alt="Auswahldialog für Bibliotheken" width="84" height="84" /></a><p class="wp-caption-text">Abbildung 3: Auswahl der Bibliothek</p></div>
<div id="attachment_452" class="wp-caption alignright" style="width: 94px"><a href="http://labs.zeroseven.de/wp-content/uploads/2008/08/bild-7.png" rel="lightbox[440]"><img class="size-thumbnail wp-image-452" src="http://labs.zeroseven.de/wp-content/uploads/2008/08/bild-7-150x150.png" alt="JUnit-Version" width="84" height="84" /></a><p class="wp-caption-text">Abbildung 4: JUnit-Version</p></div>
<p>Erstellen Sie ein neues Java-Projekt in Eclipse und vergeben Sie einen sinnvollen Namen <em>(Abbildung 1)</em>. Unser Beispiel wird aus simplen Rechenfunktionen bestehen. Wichtig ist, das in den Build-Einstellungen im Reiter Libraries die JUnit-Bibliothek eingebunden wird. Dazu wählt man Add Library &#8230; <em>(Abbildung 2)</em> und dann JUnit (<em>Abbildung 3)</em>. Im darauffolgenden Fenster kann die Version von JUnit ausgewählt werden. In unserem Fall nehmen wir die Version 4 <em>(siehe Abbildung 4).</em></p>
<p><strong>Schritt 2: Anlegen eines Tests</strong></p>
<div id="attachment_469" class="wp-caption alignright" style="width: 94px"><a href="http://labs.zeroseven.de/wp-content/uploads/2008/08/bild-8.png" rel="lightbox[440]"><img class="size-thumbnail wp-image-469" src="http://labs.zeroseven.de/wp-content/uploads/2008/08/bild-8-150x150.png" alt="JUnit in Eclipse" width="84" height="84" /></a><p class="wp-caption-text">Abbildung 5: JUnit in Eclipse</p></div>
<p>Wir legen uns die Klasse Rechnen.java <em>(Quellcode 1)</em> in unserem Projekt an. Das wird die Klasse sein, welche die zu testenden Funktionen enthält. Wir erstellen uns eine Methode names <code>addiere()</code>. Die Funktion empfängt zwei Zahlen addiert diese beiden und gibt diese zurück. Wir werden diese Klasse später noch um weitere Funktionen erweitern. Wie ich in Teil 1 der Artikelreihe schon erwähnt habe, werden für gewöhnlich die Tests zuerst geschrieben und dann die Funktion implementiert.</p>
<p>Als nächstes erstellen wir uns die Klasse TestRechnen.java <em>(Quellcode 2)</em>. Diese erbt von der JUnit-Klasse <code>TestCase</code>. Wir erzeugen eine neue Instanz von Rechnen, deren Funktionen wir Testen wollen. Die Methode, welche den Test ausführt nennen wir <code>testAddiere()</code>. Alle Methoden, welche einen Test ausführen, müssen auch mit test beginnen. Innerhalb der Funktion wird assertEquals aufgerufen. Diese Funktion wird von JUnit gestellt. AssertEquals überprüft ob der Wert den man erwartet der Gleiche ist, welcher von der zu testenden Funktion zurückgegeben wird. In unserem Beispiel erwarten wir das der Aufruf der Methode addiere mit den Zahlen 1 und 1, 2 ergeben.</p>
<pre>Quellcode 1: Rechnen.java
package de.zeroseven.tutorials;

public class Rechnen {

	public int addiere(int zahl1, int zahl2) {
		return zahl1 + zahl2;
	}
}</pre>
<p>Um unseren Test nun auszuführen, klicken wir mit Rechts auf TestRechnen und wählen Run As &#8230; -&gt; JUnit-Test. In dem sich darauf öffnenden <em>(Abbildung 5)</em> Fenster, werden nun alle Tests angezeigt. Die allerwichtigste Anzeige ist der große grüne Balken, welcher anzeigt das alle Tests ohne Fehler durchlaufen worden sind. 1 und 1 sollte ja auch 2 ergeben. Um zu sehen, wie es aussieht wenn ein Test schief läuft, stellen Sie den Erwartungswert auf was Anderes als 2. Dann wird der grüne Balken rot angezeigt.</p>
<pre>Quellcode 2: TestRechnen.java
package de.zeroseven.tutorials;

import junit.framework.TestCase;

public class TestRechnen extends TestCase {

	private Rechnen myRechnen = new Rechnen();

	public void testAddiere() throws Exception {
		assertEquals(2, myRechnen.addiere(1,1));
	}
}</pre>
<p>Unterhalb des Balkens werden Details zum Schieflaufen des Tests angezeigt, wie zum Beispiel wo der Fehler aufgetreten ist. Was uns durch die Veränderung des Erwartungswertes angezeigt wird ist kein Fehler sondern ein Failure. Ein Fehler wird in JUnit als Error bezeichnet. Um dies zu provozieren fügen wir eine neue Testfunktion namens testError ein <em>(Quellcode 3)</em>. Diese macht nichts anderes als eine Exception zu werfen. Ändern Sie den Erwartungswert wieder auf 2 und starten sie den Unit-Test neu. Nun wird ein Fehler und kein Failure mehr angezeigt.</p>
<pre>Quellcode 3: Funktion die einen Error erzeugt
public void testError() throws Exception {
	throw new Exception("Irgendwas lief schief");
}</pre>
<p>Das war unser erster einfacher Unit-Test. Im nächsten Teil der Reihe werde ich auf die unterschiedlichen Testmethoden wie <code>assertEquals</code>, welche JUnit schon mitbringt.</p>
]]></content:encoded>
			<wfw:commentRss>http://labs.zeroseven.de/development/java/unit-testing-in-java-teil-2-ein-einfaches-beispiel/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Unit Testing in Java Teil 1: Grundlagen</title>
		<link>http://labs.zeroseven.de/development/java/unit-testing-in-java-teil-1-grundlagen/</link>
		<comments>http://labs.zeroseven.de/development/java/unit-testing-in-java-teil-1-grundlagen/#comments</comments>
		<pubDate>Fri, 15 Aug 2008 12:34:19 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Grundlagen]]></category>
		<category><![CDATA[JUnit]]></category>
		<category><![CDATA[Programmierpraxis]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Softwareentwicklung]]></category>
		<category><![CDATA[Softwareprojekte]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[Unit Testing]]></category>
		<category><![CDATA[Zweck]]></category>

		<guid isPermaLink="false">http://labs.zeroseven.de/?p=398</guid>
		<description><![CDATA[Testen ist bei einem Softwareprojekt ein wichtiger Schritt. Häufig wird dieser Schritt am Schluss und zu kurz gemacht, dabei ist Softwareentwicklung, gerade größere Projekte, immer fehleranfällig. Im Gegensatz dazu bedeutet Unit-Testing das Testen während der Implementierung. Die Tests werden sogar vor der eigentlichen Implementierung geschrieben. Das hat den Vorteil das man durch das Schreiben der [...]]]></description>
			<content:encoded><![CDATA[<p>Testen ist bei einem Softwareprojekt ein wichtiger Schritt. Häufig wird dieser Schritt am Schluss und zu kurz gemacht, dabei ist Softwareentwicklung, gerade größere Projekte, immer fehleranfällig. Im Gegensatz dazu bedeutet Unit-Testing das Testen während der Implementierung. Die Tests werden sogar vor der eigentlichen Implementierung geschrieben. Das hat den Vorteil das man durch das Schreiben der Test den größten Teil des Codes automatisch schreibt.</p>
<p><span id="more-398"></span></p>
<p>Ein Unit-Test beschreibt einen Test der den logischen Teil einer Software testet, der nicht syntaktisch oder aufgrund implementierter Fehlererkennung zu Fehlern führen kann. Ein Beispiel ist ein Algorithmus der 2 Zahlen addiert. Ein Unit-Test kann nun zum Beispiel überprüfen, ob richtig addiert wird, indem man dem Test Eingabeparameter und das zu erwartende Ergebnis mitgibt. Stimmt das errechnete Ergebnis nun mit dem zu erwartenden Ergebnis überein, so wird der Test erfolgreich durchlaufen. So können automatsich Zustände abgefangen werden, die häufige Fehlerquellen sind. Zum Beispiel die Eingabe von negativen Werten, Duplikaten oder null. Das Ergebniss kann entweder ein OK, ein Failure oder ein Error sein. Failures treten am häufigsten auf und beschreiben das &#8220;Fehlschlagen&#8221; des Tests. Dabei werden die Erwartungswerte des Tests nicht erfüllt. Ein Error tritt auf wenn ein Fehler auftritt, der ein &#8220;richtiger Softwarefehler&#8221; ist. So werden nach und nach alle Komponenten getestet. Ziel sollte es sein, das keine Funktion und Klasse als Produktionscode gesehen werden soll, bis nicht alle Tests erfolgreich durchlaufen werden.</p>
<p>Unit-Testing beeinflusst durch seine Modularität den gesamten Entwicklungsprozess. Fügt ein Entwickler weitere Änderungen zum Code hinzu, dann prüft er zuerst ob die Software alle Tests erfolgreich durchläuft und stellt somit sicher das später auftretende Fehler höchstwahrscheinlich an seiner Implementierung liegen.</p>
<p>Ich verwende in diesen Artikeln Eclipse das JUnit schon mit sich führt. Arbeitet man ohne Eclipse müssen die entsprechenden Klassenpfade und Bibliotheken angepasst werden. Auf <a title="JUnit Homepage" href="http://www.junit.org" target="_blank">www.junit.org</a> kann man sich die aktuelle Version herunterladen und weitere Informationen zu JUnit erhalten.</p>
<p>In Teil 2 dieses Artikels werden wir nächste Woche unseren ersten Unit-Test schreiben und anwenden.</p>
]]></content:encoded>
			<wfw:commentRss>http://labs.zeroseven.de/development/java/unit-testing-in-java-teil-1-grundlagen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java &#8220;Einsichten&#8221;</title>
		<link>http://labs.zeroseven.de/development/java/java-einsichten/</link>
		<comments>http://labs.zeroseven.de/development/java/java-einsichten/#comments</comments>
		<pubDate>Fri, 11 Jul 2008 07:42:54 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[aufrufende Funktionen]]></category>
		<category><![CDATA[Debugging]]></category>
		<category><![CDATA[Einsicht]]></category>
		<category><![CDATA[getDeclaredFields()]]></category>
		<category><![CDATA[getStackTrace()]]></category>
		<category><![CDATA[Introspektion]]></category>
		<category><![CDATA[Profiling]]></category>
		<category><![CDATA[StackTrace]]></category>

		<guid isPermaLink="false">http://labs.zeroseven.de/?p=191</guid>
		<description><![CDATA[Manchmal ist es nützlich wenn ein Programm zur Laufzeit über sich selbst Bescheid weiss. Mit dem Zugang auf sich selbst kann man Funktionen implementieren, die beim Entwickeln gewisse Abläufe vereinfachen können. Ein Beispiel dafür ist die dynamische Ausgabe des Inhalts der Struktur eines Objekts zur Laufzeit. Das kann zu Debugging Zwecken nützlich sein, wenn kein [...]]]></description>
			<content:encoded><![CDATA[<p>Manchmal ist es nützlich wenn ein Programm zur Laufzeit über sich selbst Bescheid weiss. Mit dem Zugang auf sich selbst kann man Funktionen implementieren, die beim Entwickeln gewisse Abläufe vereinfachen können. Ein Beispiel dafür ist die dynamische Ausgabe des Inhalts der Struktur eines Objekts zur Laufzeit. Das kann zu Debugging Zwecken nützlich sein, wenn kein Debugger vorhanden ist, zum Beispiel auf einem Server. Um auf die Felder eines Objekts zugreifen zu können verwendet man</p>
<p><span id="more-191"></span></p>
<p><code>Field[] myFields = this.getClass().getDeclaredFields();</code></p>
<p>um auf die Methoden eines Objekts zugreifen zu können verwendet man</p>
<p><code>Method[] myMethods = this.getClass().getMethods();</code></p>
<p>wobei <code>this</code> durch eine beliebige Klasse ersetzt werden kann. Java verbietet es von Haus aus auf private Felder zugreifen zu können. Jedoch kann mit der Methode <code>setAccessible(true)</code> der Zugriff erlaubt werden. Mit diesen Werkzeugen an der Hand ist es nun ein Leichtes eine Methode zu schreiben, welche zur Laufzeit den Inhalt jedes beliebigen Objekts ausgeben kann.</p>
<p>Eine weitere interessante &#8220;Einsicht&#8221; ist die Rückverfolgbarkeit, von welcher Funktion aus eine Funktion aufgerufen wurde. Meinem Wissensstand nach gibt es leider in Java kein Bordmittel um auf diese Information zuzugreifen. Allerdings gibt es einen &#8220;Hack&#8221; um das zu bewerkstelligen. Jedesmal wenn eine Funktion aufgerufen wird, dann legt Java ein Element mit diversen Informationen, darunter auch den Namen der Funktion, auf seinen internen Verwaltungsstack. Wird die Funktion verlassen wird das Stackelement wieder vom Stack genommen. Dadurch ist zum Beispiel die Funktion <code>printStackTrace()</code> zur Ausgabe von StackTraces bei Exceptions möglich. Schaut man sich den Stack an, dann sieht man in welcher Reihenfolge Funktionen aufgerufen wurden. Diesen Umstand machen wir uns zum Nutzen und generieren in einer Funktion eine Standard-Exception. Diese beinhaltet natürlich den Stack zum Zeitpunkt zu dem die Exception generiert wrude.</p>
<p>Mit <code>StackTraceElement stackElement = myException.getStackTrace()[n]</code> greift man dann auf das n-te Element des Stacks zu. Um auszugeben welche Funktion die Funktion, in welcher die Exception erzeugt wurde, aufgerufen hat, wäre das das 1te Element also <code>getStackTrace()[1]</code>. Um den Namen einer Funktion auszugeben ruft man dann auf dem <code>StackTraceElement</code> die Funktion <code>getMethodName()</code> auf.</p>
<p>Durch die beiden oberen &#8220;Einsichten&#8221; lassen sich einige Funktionalitäten generalisieren und in eigene Klassen auslagern um bei Bedarf wieder darauf zuzugreifen. Zugegebenermassen ist die Methode über Exceptions auf den Stack zuzugreifen etwas dirty, funktioniert aber wunderbar und ermöglicht Funktionen die unnötige Tiparbeit ersparen. Ich zum Beispiel verwende diese Funktion zum Profiling und weiss dadurch immer welche Funktionen davon betroffen sind.</p>
]]></content:encoded>
			<wfw:commentRss>http://labs.zeroseven.de/development/java/java-einsichten/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bildskalierung mit Java ohne getScaledInstance()</title>
		<link>http://labs.zeroseven.de/development/java/bildskalierung-mit-java-ohne-getscaledinstance/</link>
		<comments>http://labs.zeroseven.de/development/java/bildskalierung-mit-java-ohne-getscaledinstance/#comments</comments>
		<pubDate>Fri, 04 Jul 2008 09:51:32 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[BufferedImage]]></category>
		<category><![CDATA[Image Processing]]></category>
		<category><![CDATA[Rendering-Hint]]></category>
		<category><![CDATA[Skalierung]]></category>

		<guid isPermaLink="false">http://labs.zeroseven.de/?p=186</guid>
		<description><![CDATA[Um Bilder von Java skalieren zu lassen gibt es die komfortable Funktion getScaledInstance(), die wie der Name sagt eine skalierte Instanz eines BufferedImage zurückliefert. Diese auf den ersten Blick praktische Funktion sollte gemieden werden, da sie veraltet ist und zu langsameren und qualitativ schlechteren Ergebnissen führt als die Skalierung über RenderingHints. Beim im Vergleich mit [...]]]></description>
			<content:encoded><![CDATA[<p>Um Bilder von Java skalieren zu lassen gibt es die komfortable Funktion getScaledInstance(), die wie der Name sagt eine skalierte Instanz eines BufferedImage zurückliefert. Diese auf den ersten Blick praktische Funktion sollte gemieden werden, da sie veraltet ist und zu langsameren und qualitativ schlechteren Ergebnissen führt als die Skalierung über RenderingHints. Beim im Vergleich mit einer schnellern Methode und identischen Bildern sind die Ergebnisse der Skalierung um 50% &#8211; 70% schneller gewesen, trotz ähnlicher oder besserer Qualität am Ende.</p>
<p><span id="more-186"></span></p>
<p>Bei der schnelleren Variante habe ich die drawImage()-Funktion des Graphics2D Kontextes eines BufferedImage verwendet, die es als Ausprägung mit Parametern zum skalierten Zeichnen gibt. Dabei wird auch der RenderingHint eingesetzt, der dafür zuständig ist, wie ein grafischer Kontext gerendert wird. Dabei muss dem Rendering-Hint ein Hint-Key und der Wert des Keys mitgegeben werden. Der Key gibt den Wert des zu beeinflussenden Rendering-Filters an, über den Wert des Keys stellt man den Algorithmus zur Neuberechnung ein. Für die Skalierung ist der Wert KEY_INTERPOLATION wichtig. Er gibt an wie die Interpolation, also die Neuberechnung der Pixel in einem Bild erfolgen soll. Dazu gibt es verschiedene Algorithmen, welche dafür verwendet werden können. Wer schon mal mit professionellen Bildbearbeitungstools gearbeitet hat, dem sollten die einstellbaren Algorithmen wie &#8220;bicubic interpolation&#8221; oder &#8220;nearest neighbor&#8221; zumindest namentlich ein Begriff sein. Von der Wahl des Algorithmus ist dann die Berechnungsgeschwindigkeit und die Qualität des Ergebnisses abhängig. Als Wert für KEY_INTERPOLATION stehen dabei folgende Werte aufsteigend in Qualität zur Verfügung</p>
<p><code><strong>VALUE_INTERPOLATION_NEAREST_NEIGHBOR</strong></code></p>
<p><code><strong>VALUE_INTERPOLATION_BILINEAR</strong></code></p>
<p><code><strong>VALUE_INTERPOLATION_BICUBIC</strong></code></p>
<p>Weitere Informationen zu Rendering-Hints gibt es wie immer in der <a title="API-Spezifikation" href="http://java.sun.com/j2se/1.5.0/docs/api/java/awt/RenderingHints.html" target="_blank">API-Spezifikation</a>. Es lohnt sich einen Blick in die Spezifikation der Rendering-Hints zu werfen, da noch andere Einstellungen beim Erzeugen oder Manipulieren von Bildern gemacht werden können.</p>
<p>Wie schon zu Beginn des Posts sollte man also auf getScaledInstance() verzichten und stattdessen den grafischen Kontext eines Bildes verkleinert oder vergrößert zeichnen, da der Geschwindigkeitgewinn im Vergleich erheblich sein kann und sich keine signifikanten Qualitätsunterschiede ergeben. Zudem ist über RenderingHints auch der gesamte Prozess einfach einzustellen.</p>
]]></content:encoded>
			<wfw:commentRss>http://labs.zeroseven.de/development/java/bildskalierung-mit-java-ohne-getscaledinstance/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
