Eccomi qua di nuovo, sono andato avanti seguendo i tuoi consigli e sono arrivato a scrivere questo (mantengo solo il codice utile alla domanda):
Classe Preferences:
codice:
import java.io.*;
public class Preferences implements Serializable
{
private static Preferences instance;
private boolean[] visibleColumns;
private boolean hideEmptyColumns,playerDown,reverseOrder;
private int currentStyleIndex,deleteMode,sortIndex;
private String filterPlayer,preferredPlayer;
private Styles styles;
private Preferences()
{
visibleColumns=new boolean[]{true,true,true,true,true,true};
currentStyleIndex=sortIndex=0;
deleteMode=1;
filterPlayer=preferredPlayer="";
styles=new Styles();
}
public Style getCurrentStyle()
{
return styles.getStyle(currentStyleIndex);
}
public static Preferences getInstance()
{
if(instance==null)
{
try
{
ObjectInputStream reader=new ObjectInputStream(new FileInputStream("Preferenze.aur"));
instance=(Preferences)reader.readObject();
reader.close();
if(!instance.isValid())instance=new Preferences();
}
catch(Exception ex){
ex.printStackTrace();
instance=new Preferences();
}
}
instance.setStyle(1);
return instance;
}
public boolean isValid()
{
if(visibleColumns==null||filterPlayer==null||preferredPlayer==null)return false;
return deleteMode>=0&&deleteMode<=2&&sortIndex>=0&&sortIndex<=7&¤tStyleIndex>=0&¤tStyleIndex<=1&&styles.isValid();
}
}
Classe Styles:
codice:
public class Styles implements java.io.Serializable
{
private Style[] styles=new Style[2];
public Styles()
{
styles[0]=new Style("basic","22b166","ed1c22");
styles[1]=new Style("ocean","1ef5fb","ffffff");
}
public Style getStyle(int index)
{
return styles[index];
}
public boolean isValid()
{
for(int i=0;i<styles.length;i++)if(!styles[i].isValid())return false;
return true;
}
}
Classe Style:
codice:
import java.awt.Color;
public class Style implements java.io.Serializable
{
private Color backgroundColor,focusColor,foregroundColor,mainColor,specialColor,textFieldBorderColor ; // etc. , solo per dare un'idea
private String name,buttonsFolder,focusButtonsFolder;
public Style(String n,String bf,String fbf)
{
name=n;
buttonsFolder=bf;
focusButtonsFolder=fbf;
// setto i vari colori che in seguito passero' al costruttore...
}
public String getButtonPath(int type,boolean focus)
{
if(focus)return "chess/img/buttons/"+focusButtonsFolder+"/"+type+".png";
return "chess/img/buttons/"+buttonsFolder+"/"+type+".png";
}
public boolean isValid()
{
return name!=null&&buttonsFolder!=null&&focusButtonsFolder!=null&&backgroundColor!=null&&focusColor!=null&&foregroundColor!=null&&mainColor!=null
&&specialColor!=null&&textFieldBorderColor!=null;
}
}
Da quello che dicevi nello scorso messaggio riguardo alla serializzazione penso di aver capito questo:
- i valori booleani non vanno controllati a livello di esistenza (non possono essere messi a null ovviamente), nel mio caso quindi il metodo isValid() di Preferences non li controlla in quanto, anche se venissero modificati, non farebbero danni.
Se invece fosse stato rimosso un header o un prefisso di quelle variabili verrebbe lanciata un'eccezione e quindi richiamato il costruttore di default.
- stesso discorso per le variabili intere, dove però controllo i valori perchè devono essere contenuti in un certo range.
- per il resto delle variabili controllo solo il fatto che non siano null, da cui la catena di metodi isValid(), che mi pare un po' ripetitiva ma dovrebbe essere necessaria per essere sicuro di non avere in seguito eccezioni che non voglio dover gestire.
E' corretto quanto ho scritto?
Per quanto riguarda invece il design ho usato appunto la doppia classe Styles (di cui ho un'istanza in Preferences) e Style.
Ho memorizzato in Preferences la variabile currentStyleIndex, e la utilizzo per reperire lo stile corrente nel metodo getCurrentStyle().
Un'altra "complicazione" è che ogni stile ha anche delle proprie immagini, quindi passo ad ogni stile le cartelle da cui prendere le immagini (per ora solo i bottoni di diversi colori) e ritorno il path con il metodo getButtonPath(), che immagino potrebbe essere scritto meglio.
Può andare bene (o almeno benino) come design ?