Je ferais ce qui suit :
public class Book
{
private final String title;
private final String isbn;
public Book(final String t, final String i)
{
if(t == null)
{
throw new IllegalArgumentException("t cannot be null");
}
if(i == null)
{
throw new IllegalArgumentException("i cannot be null");
}
title = t;
isbn = i;
}
}
Je pars du principe que
1) le titre ne changera jamais (le titre est donc définitif) 2) l'isbn ne changera jamais (l'isbn est donc définitif) 3) qu'il n'est pas valable d'avoir un livre sans titre et sans isbn.
Considérons une classe d'étudiants :
public class Student
{
private final StudentID id;
private String firstName;
private String lastName;
public Student(final StudentID i,
final String first,
final String last)
{
if(i == null)
{
throw new IllegalArgumentException("i cannot be null");
}
if(first == null)
{
throw new IllegalArgumentException("first cannot be null");
}
if(last == null)
{
throw new IllegalArgumentException("last cannot be null");
}
id = i;
firstName = first;
lastName = last;
}
}
Un étudiant doit être créé avec un identifiant, un prénom et un nom. L'identifiant de l'étudiant ne peut jamais changer, mais le nom et le prénom d'une personne peuvent changer (mariage, changement de nom suite à la perte d'un pari, etc...).
Lorsqu'il s'agit de décider quels constrructeurs utiliser, il faut vraiment réfléchir à ce qu'il est logique d'avoir. Trop souvent, les gens ajoutent des méthodes set/get parce qu'on leur a appris à le faire, mais c'est très souvent une mauvaise idée.
Il est préférable d'avoir des classes immuables (c'est-à-dire des classes avec des variables finales) plutôt que des classes mutables. Ce livre : http://books.google.com/books?id=ZZOiqZQIbRMC&pg=PA97&sig=JgnunNhNb8MYDcx60Kq4IyHUC58#PPP1,M1 (Effective Java) présente une bonne discussion sur l'immutabilité. Regardez les points 12 et 13.