Code style: Remove unnecessary statements and keywords

Bad

Good

import java.lang.*;


import java.util.*;

import java.util.Scanner;

import java.util.*;

class MyClass extends Object { }

class MyClass { }

class MyClass {

int i = 0;

boolean b = false;

char c = '\u0000';

String s = null;

double d = 0.0;

}

class MyClass {

int i;

boolean b;

char c;

String s;

double d;

}

class MyClass {

MyClass() { super(); }

}

class MyClass {

MyClass() { }

}

interface MyInterface {

public abstract void foo();

}

interface MyInterface {

void foo();

}

void lollipop() {

return;

}

void lollipop() {

}

java.lang.String s;

String s;

Object[] param = new Object[ 1 ];

param[ 0 ] = i;

Object[] param = { i };

Something missing?

Labels:

Bean-Bean Mapping mit Dozer

Dozer ist eine kleine Open-Source Bibliothek (Apache-Lizenz) zum Mappen von JavaBeans auf JavaBeans. Motivationen gibt es genug -- die Webseite zählt gleich einige Argumente auf:

  • A mapping framework is useful in a layered architecture where you are creating layers of abstraction by encapsulating changes to particular data objects vs. propagating these objects to other layers (i.e. external service data objects, domain objects, data transfer objects, internal service data objects). A mapping framework is ideal for using within Assembler type classes that are responsible for mapping from one data object to another.
  • For SOA/ESB systems, a side effect is the passing of domain objects between different systems. Typically, you won't want internal domain objects exposed externally and won't allow for external domain objects to bleed into your system.
  • Mapping between data objects has been traditionally addressed by hand coding value object assemblers (or converters) that copy data between the objects. Most programmers will develop some sort of custom mapping framework and spend countless hours and thousands of lines of code mapping to and from their many transfer objects.
  • A generic mapping framework solves these problems. Dozer is an open source mapping framework that is robust, generic, flexible, reusable, and configurable.
  • Data object mapping is an important part of layered service oriented architectures. Pick and choose the layers you use mapping carefully. Do not go overboard as there is maintenance and performance costs associated with mapping data objects between layers.

Basis des Mappings sind XML-Dokumente: Im einfachsten Fall:

<mappings>          
<mapping>
<class-a>net.sf.dozer.util.mapping.vo.TestObject</class-a>
<class-b>net.sf.dozer.util.mapping.vo.TestObjectPrime</class-b>

Any custom field mapping xml would go here........
</mapping>


Angestoßen wird er über ein Mapping-Objekt, welches auch leicht von Spring injiziert werden kann:

MapperIF mapper = new DozerBeanMapper();
DestinationObject destObject = (DestinationObject) mapper.map(sourceObject, DestinationObject.class);

Interessant finde ich die JMX-Integration. Der Mapper gibt Statistik-Informationen etwa über die Anzahl gemappter Objekte.

Labels:

Uff: Noch mehr Einkäufe. Oracle holt sich Bea

Das gibt's ja nicht: Sun kauft MySQL

Verzeichnisstrukturen für Java-Projekte

In den Java-Projekten haben sich unterschiedliche Verzeichnisstrukturen durchgesetzt. Je nach Komplexität ist eine einfache ausreichend oder eine starke Strukturierung gibt eine Vorgabe.

Eine einfache Vorgabe ist, die Order mit dem Quellcode und den übersetzten Klassendateien zu trennen. Die üblichen Ordnernamen für Java SE-Projekte sind src und bin. Entwicklungsumgebungen wie Eclipse übersetzten Java-Typen aus dem src- in den bin-Ordner und kopieren Ressourcen wie Bilder und Übersetzungsdateien bei jedem Build ebenfalls in den src-Ordner. Eclipse unterstützte diesen Aufbau standardmäßig, wenn beim Dialog für ein neues Java-Projekt unter „Project Layout“ die Option „Create separate folders vor source and class files“ aktiviert ist.

Unter NetBeans ist die Standardstruktur etwas anders und eng mit dem Build-Tool Ant verbunden. Der Ordner src enthält die Standard-Klasen und Ressourcen, ein zweiter Ordner test die Test-Klassen und Ressourcen. Die übersetzten Java-Klassen nimmt der Ordner build/classes auf. Das Ergebnis des Builds, eine Jar-Datei im Fall eines einfachen Java-Projekts, steht im Ordner dist.

Einen deutlichen Schritt weiter geht die Anregung vom Build-Manager Maven. Es schlägt zwei Hauptordner src und target vor. Der src-Ordner enthält alle Quellen und Ressourcen und ein build übersetzt das Projekt in den target-Ordner. Maven empfiehlt, den src-Ordner weiter nach Artefakten zu unterteilen: main (eigentliche Applikation oder Bibliothek), test (Testfälle), demo (Beispiele). Unter diesen Artifakten-Ordnern folgenden weitere Unterordner. Der wichtigste Ordner ist für Java-Projekte java. Es kommen optional hinzu: ressources (für Ressourcen), config (Konfigurationsdaten), webapp (Dateien einer Web-Applikation). Für den Ausgabeordner target wiederum sieht Maven die Unterteilung in classes (übersetze Klassen aus src/main/java und Kopie aus src/main/resources), javadoc (Java-Doc von src/main/java), test-classes (Test-Klassen aus src/test/java und Kopie aus src/test/resources).

Inconsistent lower/uppercase abbreviations in Java type names

Library

Uppercase Variant

Lowercase Variant

Special Case

Java SE

GZIPOutputStream

ZipOutputStream

HttpURLConnection

DGC

MidiSystem

StAXSource

AWTError

JdbcRowSet

 

HTML

Clob, Blob, NClob

 

ImageIO

 

 

JAXBContext

 

 

JMXConnector

 

 

JPEGImageWriteParam

 

 

PBEKey

 

 

RMIClassLoader

 

 

RSAKey

 

 

SAXParser

 

 

SOAPElement

 

 

SQLException

 

 

SSLContext

 

 

UIDefaults

 

 

URI, URL, PrinterURI

ReferenceUriSchemesSupported

 

Java EE

XMLEvent

XmlElement

W3CDomHandler

XMLOutputFactory

XmlSchema

 

XMLType

XmlType

 

EJB

Xid

 

ELResolver

JspTag

 

HTTPBinding

HtmlMessage

 

JAXBElement

SqlResultSetMapping

 

JDBCStats

HttpServlet

 

JMSSessionStats

 

 

JVMStats

 

 

SAAJResult

 

 

SOAPBinding

 

 

URIValidator

 

 

XAConnection

 

 

Spring

MessageEOFException

JmsException

 

OC4JJtaTransactionManager

JmxUtils

 

SQLErrorCodes

SqlCall

 

SQLExceptionTranslator

SqlFunction

 

URIEditor

UrlResource

 

 

JndiRmiClientInterceptor

 

 

JpaTemplate

 

 

JstlView

 

 

MimeMailMessage

 

 

SimpleJaxWsServiceExporter

 

 

XmlBeanFactory

 

Apache Commons

NTPUDPClient

NtpUtils

HttpURL

FTPClient, POP3Client

HttpClient

 

SimpleSMTPHeader

 

 

NTLMScheme

 

 

RFC2965Spec

 

 

URI

 

 

 

What is your favourite example or inconsistent usage?

 

 

Werbung: Wir haben neue Java-Seminare!

Buchkritik: Beautiful Code: Leading Programmers Explain How They Think

Beautiful Code: Leading Programmers Explain How They Think
Andy Oram, Greg Wilson. O'Reilly. 2007. 618 Seiten
Bekannten Autoren und Software-Architekten geben in 33 Kapiteln viele Beispiele ihrer Kunst, und Einblicke in ihr Schaffen. Doch sehr spezielle Beispiele in diversen Programmiersprachen machen es für Java-Programmierer schwer, hier „schönen Code“ zu entdecken. Unter dem Strich bleibt nicht viel für Java-Entwickler über, wenn Programmiersprachen wie C, Ruby, LISP ihren Platz finden und Algorithmen vorgestellt werden, die für die allermeisten kaum relevant sind. Interessant ist es allemal, und wer sich viel Zeit für die Einarbeitung nimmt, wird auch sicherlich viel entdecken, zumal das Design einen größeren Stellenwert einnimmt, als der Quellcode an sich. Bei den wenigen Java-Programmen gibt leider etwas zu bemängeln. Einmal ein einfacher Fehler auf Seite Seite 478, in dem die Klammerung falsch ist:

class Sample {}
public static void main(String[] argv) {
System.out.println("Hello World");
}

Der zweite Hammer haut aber stärker rein und ist definitiv kein Beispiel für „Beautiful Code“. Seite 332 stellt eine EJB Session-Bean FileReaderBean vor, die über eine FileInputStream Daten vom Dateisystem holt – das ist nun wirklich nicht in Ordnung. Toll finde ich, dass die Erlöse an Amnesty International gehen: „All royalties from this book will be donated to Amnesty International.”. Das nette Kapitel Code in Motion ist online verfügbar.

Labels: