Convenzioni per la codifica

Sorgente

Il suffix di un file che contiene codice java è .java

Il suffix di un file che contiene il bytecode è .class

Un file sorgente non deve essere più lungo di 2000 righe di codice.

Un file contiene al massimo una class pubblica o una interface pubblicca. La class pubblica o la interface pubblica è la prima class dichiarata dentro il file.

Un file sorgente inizia con un commento:

/* 
 * Il nome della class
 * La versione
 * La data
 * Il copyright che si applica
 */
Dopo si fa la dichiarazione di package e gli import nell'ordine seguente:
package mio.package;

import altro.package1.Object1;
import altro.package1.Object2;
import altro.package2.Object3;

Dichiarazioni di class e interface

Prima della dichiarazione della class c'è un commento per la documentazione javadoc
/**
 * Descrizione  della class 
 *
 * @version il numero di versione e la data
 * @author  l'autore della class
 **/
Dopo la definizione della class
public class Point {
abbiamo nell'ordine:
  1. le variabili statiche in ordine di visibilità (prima public, protected, default, private):
    /** commento per scale */
    public static int scale;
    
    /** commento per number */
    private static int number;
    
  2. i campi in ordine di visibilità (simile a quello delle variabili statiche):
    /** commento per x */
    public int x;
    
    /** commento per y */
    public int y;
    
  3. i costruttori:
    /** commento per il primo costruttore */
    Point(int x, int y) {
      ...
    }
    
    /** commento per il secondo costruttore */
    Point(int x) {
      ...
    }
    
  4. i metodi raggruppati per funzionalità piuttosto che ordinati per visibilità:
     /** commento per il metodo */
     int distanceToOrgin() {
      ...
    }
    

Scelta dei nomi

Package

Il nome di un package dovrebbe essere composto solamente di lettere minuscole usando una gerarchia simile a quella degli indirizzi Web ma in senso inverso, ovvero dal più generico al più specifico:
package it.univaq.lsp.progetto;

Class

Il nome della class è un sostantivo. Il nome dovrebbe essere esplicito, senza usare abbreviazioni. Un nome inizia con una maiuscola, ogni maiuscola indica uno spazio:
class PuntoColorato {
  ...
}

Interface

Vale una convenzione uguale a quella data per le classi.

Metodi

Il nome di un metodo è un verbo. Il nome inizia con una minuscola, ogni maiuscola indica uno spazio:
int getX() {
 ...
}

Indentazione

L'indentazione è di 4 caratteri. Una riga non dovrebbe avere più di 80 caratteri. Le regole per tagliare sono:

Dichiarazione

Variabile

Le regole sono
void method() {
  int int1 = 0; //inizio del block del metodo
  if (test) {
    int int2 = 0; // inizio del block del then
    ...
  }
  ...
} 

Metodo

Nessun spazio fra il nome del metodo e la parentesi (. La parentesi { viene posta alla fine della prima riga della dichiarazione. Il body della dichiarazione è indentato. L'ultima riga della dichiarazione è la sola parentesi }.
int getX() {
     return x;
}
I metodi sono separati fra di loro con una riga bianca.

Istruzioni

If

  if (test) {
      ...
  }
o
  if (test) {
      ...
  } else {
      ...
  }

For

  for (init; test; incr) {
      ...
  }

While

  while (test) {
      ...
  }

DoWhile

  do {
      ...

  } while (test) 

Switch

Quando un caso dello switch non usa un break, un commento esplicito dovrebbe indicare che questo non è un errore ma è voluto.
  switch (test) {
  case 1:
      istruzione;
      /* No break */
  case 2:
      istruzione;
       break;
  case 3:
      istruzione;
       break;
  default:
      istruzione;
  }

Try Catch

 
try {
    istruzione;
} catch (Exception e) {
    istruzione;
} finally P
    istruzione;
}

Spazi bianchi

Riga

Mettere due righe fra class o interface nello stesso sorgente ed una riga fra i metodi.

Spazio bianco

C'è sempre uno spazio bianco

Pratica

Ordine dei modificatori

L'ordine dei modificatori è il seguente:

(public o protected o private o niente) dopo (abstract o static o niente) dopo (final o niente).

Per esempio:

class A {
  public static final int VAL = 1;
  private int x;
  public final int getX() {
    return x;
  }
}

Valori

I valori (numerici o stringhe) non devono comparire nel body dei metodi. Invece si usano delle costanti. Per esempio
class A {

  boolean getAnswer() throws NoAnswerException {
    for (int i = 0; i < 10; i++) {
      printMessage("Yes or No?");
      String s = readAnswer();
      if ("Yes".equals(s)) {
        return true;
      } else ("No".equals(s)) {
        return false;
      }
    }
    throw new NoAnswerException();
  }
}
Meglio:
class A {

  static final String MESSAGE = "Yes or No?";
  static final String YES = "Yes";
  static final String NO = "No";
  static final int ITER = 10;

  boolean getAnswer() throws NoAnswerException {
    for (int i = 0; i < ITER; i++) {
      printMessage(MESSAGE);
      String s = readAnswer();
      if (YES.equals(s)) {
        return true;
      } else (NO.equals(s)) {
        return false;
      }
    }
    throw new NoAnswerException();
  }
}

Laurent Théry
Last modified: Sun Feb 1 01:03:10 MET 2004