allora ho risolto così:
Oggetto Libretto:
codice:
public class Libretto {
	private static final int VOTO_MINIMO = 18;
	private static final int VOTO_MASSIMO = 30;
	String materia;
	int voto;
	int crediti;

	public Libretto() {
		this.materia = inserisceMateria();
		this.voto = inserisceVoto();
		this.crediti = inserisciCrediti();
	}
	
	/**
	 * Inserisce la materia.
	 * @return materia: il valore corrente della materia inserita.
	 */
	public String inserisceMateria() {
		System.out.println("inserisci materia");
		Scanner in = new Scanner(System.in);
		return this.materia = in.next();
	}
	
	/**
	 * Inserisce il voto.
	 * Controlla che il voto sia compreso tra 18 e 30,
	 * se inferiore o superiore restituisce un valore negativo.
	 * @return votoValido: il valore corrente del voto inserito.
	 */
	public int inserisceVoto() {
		System.out.println("inserisci voto");
		Scanner in = new Scanner(System.in);
		this.voto = in.nextInt();
		int votoValido; //valore di ritorno

		if ((this.voto >= VOTO_MINIMO) && (this.voto <= VOTO_MASSIMO)) {
			votoValido = this.voto;
		} else {
			votoValido = -1;
		}
		return votoValido;
	}
	
	/**
	 * Inserisce i crediti.
	 * @return crediti: il valore corrente dei crediti inseriti.
	 */
	public int inserisciCrediti() {
		System.out.println("inserisci crediti");
		Scanner in = new Scanner(System.in);
		return this.crediti = in.nextInt();
	}

	public String restituisciMateria() {
		return materia;
	}

	public int restituisciVoto() {
		return voto;
	}

	public int restituisciCrediti() {
		return crediti;
	}

	public boolean compareTo(Libretto libretto) {
		if (this.restituisciMateria().compareTo(libretto.restituisciMateria()) == 0) {
			if (Integer.toString(this.restituisciVoto()).compareTo(Integer.toString(libretto.restituisciVoto())) == 0) {
				return Integer.toString(this.restituisciCrediti()).compareTo(Integer.toString(libretto.restituisciCrediti())) ==  0;
			}
			else return Integer.toString(this.restituisciVoto()).compareTo(Integer.toString(libretto.restituisciVoto())) > 0;
		}
		else return this.restituisciMateria().compareTo(libretto.restituisciMateria()) > 0;
	}
}
Gestione dell'oggetto:
codice:
public class GestioneLibretto {
	/*
	 * contiene gli oggetti di tipo libretto creati dall'utente.
	 */
	Libretto[] arrLibretto;

	/**
	 * Definisce la dimensione massima del libretto.
	 * 
	 * @param dimensione
	 *            : dimensione massima inserita dall'utente.
	 */
	public void definisciDimensione(int dimensione) {
		arrLibretto = new Libretto[dimensione];
	}

	/**
	 * Popola il libretto in base alla dimensione del libretto inizializzato
	 * dall'utente.
	 */
	public void aggiungiElementi() {
		for (int i = 0; i < arrLibretto.length; i++) {
			Libretto libretto = new Libretto();
			arrLibretto[i] = libretto;
		}
	}

	/**
	 * Visualizza gli elementi presenti nel libretto; Visualizza la materia, il
	 * voto e i crediti relativi all'elemento appartenente al libretto; la
	 * variabile "j" inizializza l'indice della lista di elementi.
	 */
	public void visualizzaElementi() {
		for (int i = 0, j = 1; i < arrLibretto.length; i++, j++) {
			System.out.println(j + ") " + arrLibretto[i].restituisciMateria()
					+ " " + arrLibretto[i].restituisciVoto() + " "
					+ arrLibretto[i].restituisciCrediti());
		}
	}

	public void ordinaElementi() {
		int dimension = arrLibretto.length;
		int counter = 0;
		boolean sorted = false;
		
		while ((counter < dimension) && (!sorted)) {
			counter++;
			sorted = true;
			
			for (int i = dimension -1; i >= counter; i--) {
				if (arrLibretto[i - 1].compareTo(arrLibretto[i])) {
					swap(i,(i-1));
					sorted = false;
				}
			}
		}
	}

	private void swap(int index1, int index2) {
		Libretto temp = arrLibretto[index1];
		arrLibretto[index1] = arrLibretto[index2];
		arrLibretto[index2] = temp;
	}
}
Anzichè dare all'utente la possibilità di scegliere come ordinare il libretto, ho creato un metodo che ordina in base a una priorità da me stabilita, evitando di fare copie inutili del codice (ho preso spunto dai tuoi consigli).
Direi problema risolto, ti ringrazio Vincenzo
Se hai qualche altro consiglio per come ottimizzare il software è ben accolto, grazie ancora.