Ciao a tutti, un po' di tempo fa avevo aperto una discussione per chiedere consigli sul design di una classe che doveva essere "leggibile" da molte altre, nel mio caso la classe contiene le preferenze che l'utente di una applicazione swing sceglie da un apposito menù.
Mi era stato consigliato (tralasciando opzioni troppo complesse per me ) di utilizzare un singleton per questa classe, che avevo implementato in modo abbastanza standard (credo) :


codice:
import java.io.*;
public class Preferences
{
	private static Preferences instance;
	private boolean[] visibleColumns;
	private boolean hideEmptyColumns,playerDown,reverseOrder;
	private int deleteMode,sortIndex;
	private String filterPlayer,preferredPlayer;
	private Preferences()
	{
		// inizializzo le variabili ai valori "di default"
		visibleColumns=new boolean[]{true,true,true,true,true,true};
		deleteMode=1;
		sortIndex=0;
		filterPlayer=preferredPlayer="";
		// ... qui leggo da file le preferenze specificate, se i valori letti sono accettabili aggiorno le variabili		
	}
	
	// ... Vari metodi getter/setter ...
	
	public static Preferences getInstance()
	{
		if(instance==null)instance=new Preferences();
		return instance; 
	}
}

Fondamentalmente la prima volta che necessito di una preferenza viene istanziata la classe che setta i propri campi ai valori di default e poi richiama un metodo che legge le preferenze da file, controlla se i valori sono ammissibili e in caso aggiorna le preferenze.


Dopo aver ampliato il numero di preferenze che l'utente può scegliere ho deciso di utilizzare la serializzazione per scrivere e leggere l'oggetto Preferences da file.


Qui sorge qualche dubbio: come faccio a essere sicuro di leggere valori "corretti", senza che il file sia stato "sporcato"?
Pensavo di modificare i controlli facendo qualcosa di questo tipo :


codice:
import java.io.*;
public class Preferences implements Serializable
{
	private static Preferences instance;
	private boolean[] visibleColumns;
	private boolean hideEmptyColumns,playerDown,reverseOrder;
	private int deleteMode,sortIndex;
	private String filterPlayer,preferredPlayer;
	private Preferences()
	{
		// Stavolta il costruttore non legge da file, imposta solo i valori di default se necessario
		visibleColumns=new boolean[]{true,true,true,true,true,true};
		deleteMode=1;
		sortIndex=0;
		filterPlayer=preferredPlayer="";
	}
	
	// ... Vari metodi getter/setter ...
	
	public static Preferences getInstance()
	{
		if(instance==null)
		{
			try
			{
				ObjectInputStream reader=new ObjectInputStream(new FileInputStream("Preferenze.aur"));
				instance=(Preferences)reader.readObject();
				reader.close();
				int dm=instance.getDeleteMode(),si=instance.getSortIndex();
				if(instance==null||(dm<0||dm>2)||(si<0||s1>7)||instance.getFilterPlayer()==null||instance.getPreferredPlayer()==null)instance=new Preferences();
			}
			catch(Exception ex){
				instance=new Preferences();
			}
		}
		return instance; 
	}
}

In pratica stavolta alla prima chiamata l'oggetto Preferences viene letto da file, e poi controllo la validità dei campi utilizzando i metodi getter sulla istanza restituita da readObject().
In caso di errori sostituisco quindi l'istanza con una creata dal costruttore che setta solo i valori di default.


Ha senso implementare questo procedimento all'interno di un singleton, e se sì è un "buon" modo di procedere ?


Infine un altro consiglio di design: voglio aggiungere per l'utente la possibilità di scegliere tra diversi "stili".
Cambiando stile verrebbero modificate impostazioni come il colore di sfondo dell'interfaccia, il colore del testo, dei bordi delle tabelle e molto altro.
Per queste carattaristiche volevo gestire una classe a parte, ColorSet, con vari campi che memorizzano i colori scelti.


Ha senso incapsulare l'oggetto ColorSet all'interno di Preferences ? E come salvare il set di colori scelto ?
Ad esempio è meglio memorizzare l'indice di un ipotetico array o mantenere un reference al ColorSet scelto, cioè va bene scrivere/leggere su file il reference a un campo della classe ?


Spero di non avere scritto troppe scemenze, grazie dell' attenzione intanto