Scopul acestui tutorial este de a vă prezenta checkstyle, un tool de analiză statică a codului java.
Acest tool configurabil are rolul de a-i semnala programatorului faptul ca nu a respectat anumite standarde de scriere a codului (ex: Sun Code Conventions, Google Java Style). Un cod care respectă standardele și un set de bune practici este mai ușor de înțeles, de depanat și de extins. Aceste standarde sunt descrise într-un fișier poo_checks.xml (vezi Resurse), care va fi importat de către checkstyle.
Checkstyle oferă o serie de verificări, toate listate în documentație. Să luăm ca exemplu de utilizare checkstyle următoarea clasă.
public class Dog { public String name; public Dog(String name) { this.name = name; } public void bark(int minutes) { System.out.println("I am barking for " + minutes + " minutes."); } }
La rularea checkstyle vom vedea urmatoarele erori:
1. Variable 'name' must be private and have accessor methods. [VisibilityModifier] 2. Parameter name should be final. [FinalParameters] 3. 'name' hides a field. [HiddenField] 4. Parameter minutes should be final. [FinalParameters] 5. Class 'Dog' looks like designed for extension (can be subclassed), but the method 'bark' does not have javadoc that explains how to do that safely. If class is not designed for extension consider making the class 'Dog' final or making the method 'bark' static/final/abstract/empty, or adding allowed annotation for the method. [DesignForExtension]
1) Aceasta eroare ne obliga să facem private acest membru și să oferim getteri si setteri pentru el.
2) + 3) Este recomandat să facem parametrul final, întrucât trebuie evitată modificarea acestuia în interiorul unei metode.
4) Parametrul trebuie să aibă alt nume față de câmpul din acea clasă.
5) Acest warning se referă la faptul că metodele publice sau protected ale unei clase ce va fi moștenită trebuie sa fie documentate.
Următorul cod reprezintă una din modalitățile de corecție ale warningurilor anterioare.
public class Dog { private String name; public Dog(final String newName) { this.name = newName; } /** * @param minutes How long this dog barks. */ public void bark(final int minutes) { System.out.println("My name is " + this.name + " and I am barking for " + minutes + " minutes."); } }