Home ORDIX AG             Dienstleistung             Trainingsshop    Kunden / Referenzen Aktuelles    Kontakt
Home  Pfeil  ORDIX News  Pfeil  1/2005
suche: 

ORDIX News Archiv

Das IT-Magazin der ORDIX AG mit Fachbeiträgen zu Datenbanken, Unix und Java/XML.

IntelliJ: Develop with pleasure ;-)

Dieses Motto hat die in Prag ansässige Firma JetBrains bei der Entwicklung ihrer mehrfach ausgezeichneten Java-Entwicklungsumgebung erfolgreich umgesetzt. Gestartet als Refactoring-Plugin für Borlands JBuilder, hat sich IntelliJ zu einer eigenständigen, sehr ausgereiften und innovativen Java IDE entwickelt. Wie viel Intelli(gentes) J(ava) steckt tatsächlich in dieser Entwicklungsumgebung, welche Funktionen und Werkzeuge sind besonders nützlich und wieso sollte Entwicklung jetzt plötzlich Freude bereiten?

Auszeichnungen für IntelliJ IDEA

- Java Developer‘s Journal Editors‘ Choice Award 2004 für IntelliJ IDEA 4.0
- Finalist in der Kategorie „Best Development Environment“ des Reader‘s Choice Awards des Javamagazin
- JavaWorld Editors‘ Choice Award 2003 für IntelliJ IDEA 3.0

Die Stärken von IntelliJ liegen nicht allein im Funktionsumfang, den diese IDE dem Entwickler zur Verfügung stellt. Projektverwaltung, Codegenerierung, Refactoring, Versionskontrolle, ANT- und JUnit-Integration, J2EE-Support, GUI-Designer, (Remote) Debugger und natürlich ein komfortabler Editor gehören mittlerweile zum Pflichtprogramm einer guten Entwicklungsumgebung.

IntelliJ besticht bei der gesamten Handhabung durch benutzerfreundliche Bedienung und Ergonomie sowie viele automatische und intuitive Hilfen bei der Projektarbeit.

Werfen wir einen Blick auf eine kleine Auswahl dieser Funktionalitäten und Eigenschaften sowie auch auf die Unterstützung der neuesten Java Version J2SE 5.0.

Modulare Projektverwaltung

Das Arbeiten mit einer IDE beginnt im Allgemeinen mit der Einrichtung eines neuen Projekts. Mit Hilfe eines Wizards werden die Eckdaten der Arbeitsumgebung (Source-Pfade, Bibliotheken, JDK, etc.) definiert. Diese vermeintlich leichte Aufgabe kann in Projekten mit unterschiedlichen Source-Pfaden und Abhängigkeiten zu anderen Bibliotheken schnell Probleme bereiten.

Mit seiner modularen Projektverwaltung bietet IntelliJ für komplexe Projektstrukturen einen guten Ansatz.

Die Sichtweise auf ein Projekt ist in projekt- und modulspezifische Einstellungen unterteilt. So können sowohl für das gesamte Projekt als auch für einzelne Module beliebige Pfade als Java-Source ein- und ausgeblendet werden.

Die Verwendung von Bibliotheken oder die Nutzung einer bestimmten JDK-Version ist in beiden Stufen konfigurierbar. Zudem können Bibliotheken global definiert und im gesamten Projekt mit allen Modulen verwendet werden. EJB- und J2EE-Application-Module unterstützen bei der Entwicklung inklusive Deployment von EJBs sowie beim Erstellen von EARs. Für Web-Anwendungen gibt es ein spezielles Web-Modul.

Code Editing

Der Editor ist mit einer sehr guten Vervollständigungsfunktion (Code Completion) ausgestattet, über die Klassennamen, Methoden, Variablen und Schlüsselwörter vervollständigt werden können (siehe Abbildung 1). Das erspart viel Tipparbeit. Weiterhin kann man sich so über die vorgeschlagenen Werte einen Überblick verschaffen, z. B. darüber, welche Klassen es zu einem eingegebenen Klassenpräfix gibt oder welche Methoden auf einer Variable aufgerufen werden können.

Code Completion
Abb. 1: Intuitive Hilfen für die Code Editierung sind die Code Completion, ...

Schreibt man einen Methodenaufruf, erscheint eine Popup-Info, in der alle Methodensignaturen aufgelistet sind (siehe Abbildung 2). Das ist besonders bei vielfach überladenen Methoden sehr hilfreich. Beim Ausfüllen langer Parameterlisten kann diese Popup-Info über ein schnell ausgeführtes Tastaturkürzel jederzeit wieder aufgerufen werden. Man erkennt durch Hervorhebung der aktuellen Parameterposition direkt, welcher Parameter nun oder als nächstes einzugeben ist.

Popup-Info für Parameter
Abb. 2: ... das Popup-Info für Parameter ...

Überaus nützlich ist auch die interne Zwischenablage (Clipboard Stacking), in der stapelweise die Inhalte mehrerer Copy-Aufrufe nacheinander gespeichert werden (siehe Abbildung 3). Eine komfortable Erweiterung für das beliebte Copy & Paste-Verfahren tippfauler Entwickler.

Clipboard Stacking Funktion
Abb. 3: ... und die Clipboard Stacking Funktion.

Hinweise auf die Fehlerursache beziehungsweise den Grund der Warnung sind in Tooltipps untergebracht. Ein Mausklick auf eine rote oder gelbe Markierung steuert die betreffende Zeile direkt an und ermöglicht so eine flotte Navigation im Sourcecode (siehe Abbildungen 4 und 5).

Fehleranzeige
Abb. 4: Rote Markierungen im Editor zeigen Fehler an.

Warnungen Abb. 5: Gelbe Markierungen symbolisieren Warnungen.

Ein intuitiver Helfer ist der Import-Assistent (siehe Abbildung 7). Da er stets aktiv ist, erkennt und erzeugt er über Alt+Enter fehlende import-Anweisungen bei der Verwendung unbekannter Klassen.

Import-Assistent
Abb. 7: Der Import-Assistent.

Ebenso hilfreich sind die sogenannten Intention Actions (siehe Abbildung 8). Hier analysiert IntelliJ Anweisungen auf Fehler und Warnungen und bietet Lösungen für das entsprechende Problem an.

Intention Actions
Abb. 8: Die Intention Actions erscheinen während der Bearbeitung des Sourcecodes automatisch bei Bedarf.

Verwendet man beispielsweise eine Anweisung, die eine Exception auslösen kann und es gibt weder eine throws-Deklaration noch einen entsprechenden try...catch-Block, unterbreitet IntelliJ beide Möglichkeiten als Lösungsvorschlag. Mit einem schnellen Mausklick wird das ausgewählte Konstrukt erzeugt und das Problem ist behoben.

Die üblichen Verdächtigen wie Syntax-Highlighting, Codestyling und Formatierungsregeln, Farbschemata für verschiedene Dateitypen, übersichtliche Darstellung der geöffneten Dateien durch einzelne Reiter und Nettigkeiten wie das Auf- und Zuklappen von Methoden, symbolische Kennzeichnung von überschriebenen und implementierten Methoden durch kleine Icons am linken Rand, Splitten des Editors in zwei Teile und ein Werkzeug zum Optimieren der Imports sorgen für einen guten Eindruck des IntelliJ Editors.

Refactoring Funktionen
Abb. 6: Alle Refactoring-Funktionen im Überblick.

Ein Popup-Menü zum Zugriff auf alle wichtigen Funktionen wie Codeanalyse, Refactoring, Navigation und CVS komplettiert diesen guten Eindruck.

Alle Features sind umfassend konfigurierbar und in vielen Fällen über Tastaturkürzel aufrufbar.

Refactoring

Stark präsentiert sich IntelliJ bei den Möglichkeiten für Refactoring. Einen Überblick über alle Funktionen bietet Abbildung 6.

Das Umbenennen (Rename) von Paketen, Klassen, Methoden und Variablen erzeugt wenig Aufwand. Alle Sourcen mit betroffenen Referenzen werden ermittelt, in einem Source-Baum übersichtlich aufgelistet und können gänzlich oder wahlweise abgeglichen werden. Ähnlich komfortabel gestaltet sich das Verschieben (Move) ganzer Pakete und Klassen sowie Klasseneigenschaften innerhalb von Vererbungshierarchien (Pull Members Up/Down).

Klassen lassen sich im Handumdrehen kopieren (Copy). Lediglich der Klassenname und das Zielpaket sind anzugeben. Ausgewählte Anweisungen können über eine Extrahierungsfunktion unter Angabe von Methodenname, Zugriffsmodifizierer und gegebenenfalls Übergabeparameter leicht zu einer Methode umgewandelt werden. Die Ausgliederung von Klasseneigenschaften in Interfaces oder Superklassen lässt sich über Extract Interface bzw. Extract Method bewerkstelligen.

Ein hilfreiches Refactoring-Mittel ist auch das sogenannte Introduce-Verfahren (siehe Abbildung 9). Damit ist es schnell und einfach möglich, Variablen, Konstanten und Parameter für selektierte Ausdrücke zu erzeugen und eine entsprechende Wertzuweisung vorzunehmen.

Refactoring mit der Introduce Variable
Abb. 9: Refactoring mit der Introduce Variable.

Alle Refactoring-Funktionen werden durch einfache Dialoge zur Eingabe und Auswahl der benötigten Angaben unterstützt. Nach einer kurzen Probierphase muss man auch größere Umstrukturierungen im Quellcode nicht mehr fürchten.

Code-Generierung

Mit Hilfe von File-Templates bietet IntelliJ Unterstützung bei der Erzeugung neuer Pakete, Klassen und Interfaces. Dazu gibt es zwei hilfreiche Vorlagen für die Generierung von Singleton- und Enumeration-Klassen.

Zusätzlich können Templates für File-Header und -Footer sowie beliebige andere Sourcecode-Fragmente eingebunden werden. Templatevariablen und -anweisungen (z. B. ${NAME}, ${USER}, #parse) ermöglichen die Definition eigener Vorlagen.

Das automatische Generieren von get..()- und set..()-Methoden erfordert lediglich die Auswahl der betreffenden Variable in dem zugehörigen Auswahldialog. Weiterhin bietet IntelliJ Unterstützung beim Erzeugen von Konstruktoren sowie bei der Implementierung der Methoden hashCode() und equals().

Das Überschreiben von Methoden und Implementieren von Schnittstellen wird mit den Funktionen Override Methods beziehungsweise Implement Methods unterstützt. Mittels Tastaturkürzel (Strg+0 bzw. Strg+I) erscheint ein Dialog zur Auswahl der betreffenden Methoden, für die anschließend der Methodenrumpf generiert wird.

Richtig Freude bereiten die sogenannten Live-Templates. Das sind benutzerdefinierte Makros, die den Sourcecode über ein Kürzel plus
<TAB> an der aktuellen Stelle vervollständigen.

Ein einfaches sout<TAB> erzeugt beispielsweise ein System.out.println("") oder ein psvm<TAB> den Methodenrumpf der main()-Methode:

public static void main(String[] args) { }

Noch schöner sind die vordefinierten Live-Templates für Collections und Arrays. Nehmen wir an, es soll der Inhalt einer Liste angezeigt werden. Die Liste wird angelegt und mit Inhalten vom Typ Integer und String gefüllt (siehe Abbildung 10).

Liste mit Integer- und String-Objekten
Abb. 10: Die Liste mit Integer- und String-Objekten vor der Verarbeitung mit einem Live-Template.

Anstatt nun selbst eine for-Schleife zu programmieren, reicht ein itco<TAB> innerhalb der Methode vollständig aus.

IntelliJ untersucht den aktuellen Gültigkeitsbereich nach Objekten vom Typ java.util.Collection und erzeugt für diese eine for-Schleife. Gleichzeitig werden die Typen der hinzugefügten Elemente analysiert und als Typumwandlungen (Cast) angeboten.

Sollten sowohl für die Collection als auch für die Casts verschiedene Optionen vorhanden sein, können diese direkt per Dropdown-Menü im erzeugten Code ausgewählt werden. Abbildung 11 zeigt das ausgeführte Live-Template.

Live-Template
Abb. 11: Live-Template itco<TAB> zum sequentiellen Durchlaufen von Collections mittels for-Schleife.

Die Verwendung all dieser Generierungsfunktionen bietet zwei wesentliche Vorteile:

Zum einen erspart man sich überflüssige und zeitaufwendige Tipparbeit und zum anderen ist direkt der erste Schritt für einen projektweit einheitlichen Kodierstil in Richtung Kodierungskonventionen vollzogen.

Erleichtert wird das Ganze durch individuelle Anpassungs- und Erweiterungsmöglichkeiten der File- und Live-Templates und die Speicherung im XML-Format, so dass diese leicht innerhalb des gesamten Entwicklerteams ausgetauscht und verwendet werden können.

Ausgefeilte Versionskontrolle

Für einfache Aufgaben ohne Versionskontrollsystem (VCS) bietet IntelliJ eine lokale History-Verwaltung zur Verfolgung von Änderungen an lokalen Sourcen. Über automatisch oder manuell gesetzte Kennzeichnungen (Label) kann man sorglos entwickeln und jederzeit bei Bedarf auf einen früheren, funktionierenden Stand zurückgreifen.

Generell unterstützt IntelliJ drei externe VCS-Systeme: GNU Concurrent Versions System (CVS), Visual Source Safe von Microsoft und Startteam von Borland.

Aufgrund der großen Beliebtheit und Verbreitung von CVS haben sich die IntelliJ-Entwickler entschieden, dieses System besonders umfangreich in ihre IDE zu integrieren.

In einer eigenen Ansicht (CVS File View, siehe Abbildung 12) sind alle Dateien mit ihrem betreffenden Status (geändert, neu, gelöscht, zusammengefügt, Konflikte) wahlweise in Listen- oder Baumstruktur dargestellt. Dateien lassen sich hier über Filtermöglichkeiten anhand ihres Status ein- und ausblenden.

CVS File View
Abb. 12: Ansicht der Dateien über die CVS File View (vergrößern!).

Übersichtlich und gut strukturiert ist auch die CVS-Historie, in der alle benötigten Informationen zu den einzelnen Versionsständen mit z. B. Versionsnummer, Datum, CVS-Kommentar, Tag- und Branch-Angaben aufgelistet sind.

Hier lassen sich - zwecks Abgleich unterschiedlicher Zweige (z. B. HOTFIX mit HEAD) oder einfach nur zur Übersicht der vorgenommenen Änderungen - zwei Versionsstände einer Datei mit einem Difference-Viewer vergleichen.

Der Difference-Viewer lässt sich übrigens auch schnell und direkt über das Haupt- oder Popup-Menü öffnen, um die geöffnete Datei mit der einst abgerufenen Version, der letzten Repository-Version oder einer beliebigen Version unter Angabe eines Tags oder Datums zu vergleichen. Die Funktion Annotate zeigt am linken Rand des Editors Informationen über die letzte Änderung einer jeden Zeile (Versionsnummer, Name des Entwicklers und Änderungsdatum).

Durch die nahezu komplette und umfassende CVS-Integration sollte nur noch in den wenigsten Fällen ein externer CVS-Client notwendig sein.

J2SE 5.0 Support

Ganz aktuell unterstützt IntelliJ die neuen API- und Sprach-Erweiterungen des neuen J2SE 5.0, Codename Tiger. Generics, Enhanced for-Loop, Autoboxing/Unboxing, Typesafe Enumerations oder Static Import werden als reguläre Sprachmerkmale anerkannt und können verwendet werden.

Das gilt insbesondere auch im Zusammenspiel mit den bereits vorgestellten Funktionen Code Completion (siehe Abbildung 13), Intention Actions, Refactoring und Live-Templates.

Code Completion mit Generics
Abb. 13: J2SE 5.0 kompatible Code Completion mit Generics.

Die Refactoringfunktion Generify hilft z. B. dabei, den Sourcecode nach Konstrukten zu durchsuchen, die durch Generics ersetzt werden können. Den Rest übernimmt IntelliJ per Mausklick, so dass alter Sourcecode früherer Java-Versionen nicht manuell geändert werden muss und schnell auf Generics umgestellt ist.

Zur Aktivierung der J2SE 5.0 Features müssen in den Projekteinstellungen lediglich die entsprechende Java-Version als JDK sowie der Sprachlevel auf 5.0 gesetzt sein.

Fazit

JetBrains hat mit seiner IDE ein sehr gutes Paket zur Entwicklung von Java-Anwendungen zusammengestellt und das zu einem sehr attraktiven Preis-Leistungsverhältnis (Lizenzen ab $ 99).

Zuverlässigkeit und Stabilität, zahlreiche intelligente Funktionen und Werkzeuge sowie eine durchweg sehr gute Ergonomie und Handhabung kennzeichnen diese Entwicklungsumgebung.

IntelliJ gehört zu den (wenigen) IDEs, die von Entwicklern für Entwickler und nicht vom Marketing für Käufer entwickelt wurde.

Ingo Vogt (info@ordix.de).