Classi statiche singleton

di il
7 risposte

Classi statiche singleton

Buon giorno,
avrei un dubbio in merito alle classi statiche:

public class CheckFolder {
	private static CheckFolder instance = null;
	private static boolean folder;
	
	
	private CheckFolder() {}
	
	public static CheckFolder getInstance() {
		if(instance == null) {
			instance = new CheckFolder();
		}
		return instance;
	}
	
	public static boolean isFolder(String stringPath) {

		return isFolder(Paths.get(stringPath));
	}
	
	public static boolean isFolder(Path path) {
		folder = Files.exists(path);
		
		return folder;
	}
}

se da eclipse creo una classe main e:

...
CheckFolder checkFolder = CheckFolder.getInstance();
		if(!checkFolder.isFolder(choosertitle)) {
			choosertitle = ".";
		}
...
Eclipse mi segnala il seguente warning:
The static method isFolder(String) from the type CheckFolder should be accessed in a static way

Quindi mi suggerisce:

if(!CheckFolder.isFolder(choosertitle)) {...
Quindi mi chiedo anche a che serve il getInstance()

7 Risposte

  • Re: Classi statiche singleton

    Robyf1 ha scritto:


    avrei un dubbio in merito alle classi statiche:
    Quella che hai postato NON è una classe "statica". Le classi "top-level" non sono mai static. Sono invece le classi "nested" ad essere static.
    public class Esterna {
    
        public static class Interna {    // questa è una "nested" (static) class
        }
    }

    Robyf1 ha scritto:


    Eclipse mi segnala il seguente warning:
    The static method isFolder(String) from the type CheckFolder should be accessed in a static way

    Quindi mi suggerisce:
    
    if(!CheckFolder.isFolder(choosertitle)) {...
    
    Quindi mi chiedo anche a che serve il getInstance()
    Il getInstance() serve a "tirar fuori" la istanza (unica per un singleton) della classe. Poi su quella istanza si presuppone che si invochino dei metodi "di istanza". I tuoi isFolder() invece non sono "di istanza" .. sono "di classe" (static). Quindi la istanza non la stai usando. E ....quindi? Senso di tutto questo?

    P.S. Invocare un metodo statico su un reference ad un oggetto tecnicamente funziona (e al massimo hai un warning con gli IDE "pignoli"). Ma è fuorviante e normalmente non si fa.
  • Re: Classi statiche singleton

    Grazie,
    quindi, se posso, qual'è il modo migliore per creare una classe "utility", che venga istanziata una volta soltanto dove mettere per esempio i miei metodi statici tipo isFolder, senza necessariamente scomodare le classi interne?
  • Re: Classi statiche singleton

    Robyf1 ha scritto:


    qual'è il modo migliore per creare una classe "utility", che venga istanziata una volta soltanto dove mettere per esempio i miei metodi statici tipo isFolder
    Se è una classe di "utilità" con SOLO metodi static, allora non ha senso che sia istanziata. Quindi: costruttore privato (=nessuno lo può usare dall'esterno) che la classe stessa non userà, poi tutti i metodi static che vuoi.
  • Re: Classi statiche singleton

    Quindi la classe potrei scriverla così:
    
    package utils;
    
    import java.nio.file.Files;
    import java.nio.file.Path;
    import java.nio.file.Paths;
    
    public class CheckFolder {
    	private static boolean folder;
    	
    	private CheckFolder() {}
    	
    	public static boolean isFolder(String stringPath) {
    		return isFolder(Paths.get(stringPath));
    	}
    	
    	public static boolean isFolder(Path path) {
    		folder = Files.exists(path);
    		return folder;
    	}
    }
    
    
    Rimane Singleton? E' una classe statica?

    ma, invece quando conviene utilizzare il getInstance()? Non dovrebbe sostituire il new MiaClasse(); quindi evitare di avere molteplici istanze?
  • Re: Classi statiche singleton

    Robyf1 ha scritto:


    Quindi la classe potrei scriverla così:
    Sì, la forma è quella. Con solo un piccolo appunto: quel campo static folder NON va bene, usa una variabile locale nel isFolder(Path) .

    Robyf1 ha scritto:


    Rimane Singleton?
    No, NON è affatto un "singleton". Di fatto non c'è mai alcuna istanza di quella classe, così come è scritta e usata.

    Robyf1 ha scritto:


    E' una classe statica?
    No, ti ripeto che le classi "top-level" non sono e non possono mai essere "static". Le "nested" class (in contrapposizione alle "inner" class) sono marcate static (come mostrato prima).

    Domanda: provieni da C#/.NET dove il concetto di "classe statica" ha un senso DIVERSO da Java??

    Robyf1 ha scritto:


    invece quando conviene utilizzare il getInstance()? Non dovrebbe sostituire il new MiaClasse(); quindi evitare di avere molteplici istanze?
    Precisiamo una cosa: avere un getInstance() statico in una classe NON vuol dire necessariamente che sia per un "singleton". E al contrario invece puoi fare una classe "singleton" SENZA mettere un metodo getInstance() (o altro nome che sia).

    "Singleton" vuol dire una cosa semplice: c'è una sola ed unica istanza della classe. Quindi la creazione di questa istanza deve (ripeto: deve) essere molto "controllata". Non può essere creata esplicitamente dall'esterno (ovviamente) e la classe deve contenere la logica per garantire che al massimo ne venga creata internamente una sola.

    E ci sono svariate varianti per farlo, dipende quando la istanza deve essere creata (subito al caricamente della classe? O in modo "lazy" solo alla prima richiesta della istanza?) e dipende se si deve considerare l'accesso "concorrente" da parte di più thread oppure no.
  • Re: Classi statiche singleton

    Domanda: provieni da C#/.NET dove il concetto di "classe statica" ha un senso DIVERSO da Java??
    No provengo dal C e uso Java da qualche anno, e ovviamente questa parte la devo ancora metabolizzare.

    Quindi:
    Quando usare una classe singleton?
    Quando invece usare una classe con metodi e/o argomenti statici?

    Ad esempio se devo caricare delle costanti per l'applicazione da un XML o file properties, utilizzo una classe Config di che tipo?
  • Re: Classi statiche singleton

    Robyf1 ha scritto:


    Quando usare una classe singleton?
    Quando vuoi garantire la presenza di UNA sola, unica, istanza della classe, perché tipicamente quella istanza rappresenta un concetto "globale" nella applicazione.

    Ad esempio java.lang.Runtime non lo puoi istanziare tu. Devi invocare Runtime.getRuntime() per ottenere l'unica istanza di Runtime fornita dal framework. Nota che il nome del metodo spesso non è così fiscale. In certi casi getInstance(), in altri come questo getRuntime().

    La istanza di Runtime che ottieni permette alla applicazione di "interfacciarsi" con l'ambiente di esecuzione su cui sta girando l'applicazione. Quindi ha senso che sia uno solo!

    Robyf1 ha scritto:


    Quando invece usare una classe con metodi e/o argomenti statici?
    Quando devi fare metodi di "utilità" per cui non c'è bisogno di avere una istanza della classe. Guarda la classe java.lang.Math (esempio molto classico). Ha solo metodi statici (e costanti) e non puoi creare alcuna istanza.

    Robyf1 ha scritto:


    Ad esempio se devo caricare delle costanti per l'applicazione da un XML o file properties, utilizzo una classe Config di che tipo?
    Qui è un po' vago come l'hai detto. Per le costanti o si fa una classe che contiene SOLO costanti (e ovviamente non istanziabile) oppure le costanti si metto solitamente nella classe a cui sono correlate.
Devi accedere o registrarti per scrivere nel forum
7 risposte