Die Installation erfolgt bei Eclipse 3.7.1 über Help, dann "Install new Software"
und anschließend über den Button Add. In das aufgetauchte Fenster gibt man nun den Namen des Plugins ein und die Update-adresse http://eclipse-cs.sf.net/update/.
Danach klickt man auf OK und das passende Plugin wird gesucht. Nun kann man im Hauptfenster Checkstyle anwählen und die Installation beginnen.
Nach einem Programmneustart ist Checkstyle erfolgreich Installiert.
Um Checkstyle nun für das bestehende Projekt zu aktivieren, öffnet man mit einem Rechtsklick auf das Projekt die Properties
und wählt dann Checkstyle aus
Nun ist Checkstyle für dieses Projekt aktiviert und warnt jetzt bei jeder Standardabweichung.
Verwendet wird die IDE mit dem Checkstyle Plugin.
Checkstyle verwendet standardmäßig die Sun Code Conventions jedoch besteht bei Checkstyle auch die Möglichkeit, eine eigene Checkliste zu erstellen.
Das folgende Beispiel zeigt die wesentliche Funktion von Checkstyle.
public class Beispiel {
public static void main(String[] args) {
int i = 10;
//Richtig platzierter Kommentar
if (i > 100) {
System.out.println("i ist groesser als 100"); //Falsch platzierter Kommentar
}
else if (i > 50) {
System.out.println("i ist groesser als 50");
}
else {
System.out.println("i ist kleiner als 50");
}
}
}
Nun wird eine neue Checkstyle-Liste angelegt. Dazu muss man das Projekt nur mit der rechten Maustaste anklicken und Properties auswählen.
Anschließend klickt man auf Checkstyle und wählt den Reiter Lokal Check Configurations. Dort klickt man auf New.
Nun können für dieses Beispiel ein Name und ein erklärender Kommentar eingetragen werden. Danach mit OK abschließen.
Jetzt ist die Kommentarcheckliste erstellt worden und muss noch mit Inhalt gefüllt werden. Dazu wählt man die Liste an und klickt auf Configure
In diesem Fenster können nun alle passenden Regeln in eine Liste aufgenommen werden.
Für das kleine Beispiel reicht eine Regel Trailing Comment wird über Add hinzugefügt und mit zwei mal OK bestätigt.
Jetzt existiert in dem Main Reiter von Checkstyle neben den standardmäßigen Sun Checks auch der selbsterstellte Kommentar Check.
Wird dieser ausgewählt und auf den Beispielcode angewandt, dann erscheint an dem falsch platzierten Kommentar eine Warnung.
Und beim Mouseover oder in dem Problems-Fenster von Eclipse wird die Warnung ausgegeben.
Um die Funktion von Checkstyle etwas besser zu verstehen wird im nächsten Beispiel ein fehlerhafter Programmcode mithilfe von Checkstyle korrigiert.
Download Beispiel2
Download Beispiel2_loesung
Das ist der fehlerhafte Programmcode:
package beispiel2;
public class Punkt {
private double x;
private double y;
public Punkt(final double xx, final double yy) {
x = xx;
y = yy;
}
public static void main(final String[] args) {
//zwei Punkte erzeugen
Punkt p1 = new Punkt(42, 10);
Punkt p2 = new Punkt(17,19);
System.out.println("p1.x = "+p1.x);
System.out.println("p1.y = " + p1.y);
p1.x = 2 * p2.y;
System.out.println("p1.x = " + p1.x);
System.out.println("p1 = " + p1);
System.out.println("laenge zum Ursprung= " + p1.lenght());
System.out.println("Verschieben und neu = " + p1.skalarMult(2));
p1.skalarMultMod(2);
System.out.println("Veraendere Punkt 1 um s = " + p1);
}
public final void setX(final double x) { this.x = x; }
public final void setY(final double tmpy) { this.y = tmpy; }
public double getX() { return this.x; }
public final double getY() { return this.y; }
public final double lenght() { return Math.sqrt(x * x + y * y); }
public final Punkt skalarMult(final double s) {
return new Punkt(x * s, y * s); }
public final void skalarMultMod(final double s) { x = s * x; y = s * y; }
public final Punkt add(final Punkt tmp) {
return new Punkt(x + tmp.x, y + tmp.y); }
public final void addMod(final Punkt tmp) {
x = x + tmp.x;
y = y + tmp.y;
}
public final String toString() { return "(" + x + ", " + y + ")"; }
}
Anschließend der korrigierte Code.
Zu jeder Nummer (Beispiel: (7)) im Code steht unter dem gesamt Code die Erklärung.
/**
* Hier der Kommentar für das Package.
* @see package-info.java (2)
*/
package src.beispiel2;
//(1)
/**
*Kommentar zur Klasse Punkt (3).
*/
public class Punkt {
/**
* Kommentar zu Konstante 1.
*/
public static final int PUNKT_EINS_X = 42;
/**
* Kommentar zu Konstante 2.
*/
public static final int PUNKT_EINS_Y = 10;
/**
* Kommentar zu Konstante 3.
*/
public static final int PUNKT_ZWEI_X = 17;
/**
* Kommentar zu Konstante 4.
*/
public static final int PUNKT_ZWEI_Y = 19;
/**
* Kommentar zu Konstante 5.
*/
public static final int SCALAR_MULT = 2;
/**
*Kommentar zur Variable x.
*/
private double x;
/**
*Kommentar zur Variable y.
*/
private double y;
/**
*Kommentar zum Konstruktor mit den Uebergabe-Parametern.
*
*@param xx double
*@param yy double
*/
//(4)
public Punkt(final double xx, final double yy) {
x = xx;
y = yy;
}
/**
*Kommentar zur Main-Methode.
*Hier sollen zwei Punkte erzeugt werden.
*@param args String[]
*/
public static void main(final String[] args) {
//Zwei Punkte erzeugen (5)
Punkt p1 = new Punkt(PUNKT_EINS_X, PUNKT_EINS_Y);
Punkt p2 = new Punkt(PUNKT_ZWEI_X, PUNKT_ZWEI_Y);
//(6)
System.out.println("p1.x = " + p1.x);
//(7)
System.out.println("p1.y = " + p1.y);
p1.x = 2 * p2.y;
System.out.println("p1.x = " + p1.x);
System.out.println("p1 = " + p1);
System.out.println("laenge zum Ursprung= " + p1.lenght());
System.out.println("Verschieben und neu = " + p1.skalarMult(SCALAR_MULT));
p1.skalarMultMod(SCALAR_MULT);
System.out.println("Veraendere Punkt 1 um s = " + p1);
}
/**
*Kommentar zur Methode SetX.
*@param tmpx Kommentar zum Uebergabeparameter.
*/
public final void setX(final double tmpx) { this.x = tmpx; }
//(8)
/**
*Kommentar zur Methode SetY.
*@param tmpy Kommentar zum Uebergabeparameter.
*/
public final void setY(final double tmpy) { this.y = tmpy; }
/**
*Kommentar zur Methode GetX.
*@return Kommentar zum Rueckgabewert.
*/
public final double getX() { return this.x; }
//(9)
/**
*Kommentar zur Methode GetY.
*@return Kommentar zum Rueckgabewert.
*/
public final double getY() { return this.y; }
/**
*Kommentar zur Methode length.
*@return Kommentar zum Rueckgabewert.
*/
public final double lenght() { return Math.sqrt(x * x + y * y); }
/**
*Kommentar zur methode skalarMult.
*@param s Kommentar zum Uebergabeparameter.
*@return Kommentar zum Rueckgabewert.
*/
public final Punkt skalarMult(final double s) {
return new Punkt(x * s, y * s); }
/**
*Kommentar zur Methode skalarMultMod.
*@param s Kommentar zum Uebergabeparameter.
*/
public final void skalarMultMod(final double s) { x = s * x; y = s * y; }
/**
*Kommentar zur Methode add.
*@param tmp Kommentar zum Uebergabeparameter.
*@return Kommentar zum Rueckgabewert.
*/
public final Punkt add(final Punkt tmp) {
return new Punkt(x + tmp.x, y + tmp.y); }
/**
*Kommentar zur Methode addMod.
*@param tmp Kommentar zum Uebergabeparameter.
*/
public final void addMod(final Punkt tmp) {
x = x + tmp.x;
y = y + tmp.y;
}
/**
*Kommentar zur Methode toString.
*@return Kommentar zum Rueckgabewert.
*/
public final String toString() { return "(" + x + ", " + y + ")"; }
}
Erklärungen
(1) Hinweis: "'beispiel2' entspricht nicht dem Muster '^[a-z]+(\.[a-zA-Z_][a-zA-Z0-9_]*)*$'."
Das ist eine Sun Konvention, die vorschreibt "packages" immer mit umgekehrtem Domainnamen voran zu benennen. Dieser soll dann durch einen Punkt getrennt sein. In diesem Fall "src.bsp2".
(2) Hinweis: "Missing package-info.java file."
Um das "package" zu dokumentieren muss eine "package-info.java" Datei in dem package angelegt werden. Dann schreibt man einen ganz normalen Kommentar und erweitert diesem mit "@see package-info.java".
(3) Hinweis: "Javadoc-Kommentar fehlt."
Alle Klassen, Methoden und Parameter müssen für Javadoc kommentiert werden.
(4) Hinweis: "Der Parameter xx sollte als 'final' deklariert sein."
Übergabeparameter müssen als 'final' deklariert werden.
(5) Hinweis:"'42' sollte durch eine Konstante definiert sein."
Für Magic-Numbers sollten Konstanten verwendet werden.
(6) Hinweis:"Nach ',' folgt kein Leerzeichen."
Nach dem Komma muss ein Leerzeichen folgen.
(7) Hinweis:"Vor und nach '+' befindet sich kein Leerzeichen."
Leerzeichen vor und nach + einfügen.
(8) Hinweis:"'x' verbirgt ein Feld."
Parameter und lokale Variablen dürfen nie den gleichen Namen wie Objektvariablen haben.
(9) Hinweis:"Die Methode 'getX' ist nicht für Vererbung entworfen - muss abstract, final oder leer sein."
Zurück zur Werkzeugübersicht