Code style: Remove unnecessary statements and keywords
8 Kommentar(e). Veröffentlicht von Christian Ullenboom am Donnerstag, Januar 17, 2008.| 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: Code Style
Bean-Bean Mapping mit Dozer
0 Kommentar(e). Veröffentlicht von Christian Ullenboom am Donnerstag, Januar 17, 2008.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: Open Source
Uff: Noch mehr Einkäufe. Oracle holt sich Bea
0 Kommentar(e). Veröffentlicht von Christian Ullenboom am Mittwoch, Januar 16, 2008.Das gibt's ja nicht: Sun kauft MySQL
0 Kommentar(e). Veröffentlicht von Christian Ullenboom am Mittwoch, Januar 16, 2008.Verzeichnisstrukturen für Java-Projekte
0 Kommentar(e). Veröffentlicht von Christian Ullenboom am Montag, Januar 14, 2008.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
2 Kommentar(e). Veröffentlicht von Christian Ullenboom am Freitag, Januar 11, 2008.| 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
2 Kommentar(e). Veröffentlicht von Christian Ullenboom am Mittwoch, Januar 09, 2008.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: Rezension
