Visualizzazione dei risultati da 1 a 10 su 14

Hybrid View

  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2014
    Messaggi
    76
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Una classe "statica" può essere solo "membro" di un'altra classe (è una nested static class). E si usano, non è quello "il male", di per sé.

    Probabilmente stai confondendo qualcosa .... una nested static class non c'entra nulla direttamente con il pattern "singleton".

    Sì ma il pattern singleton può avere svariate varianti a livello implementativo. Dipende se l'oggetto va creato subito o in modo lazy, se deve tenere conto della concorrenza (=sincronizzazione) oppure no.

    Qui non ho ben capito il senso del dubbio. Se una classe ha solo metodi di "utilità" (come es. java.lang.Math o java.util.Collections) ha senso mettere un costruttore privato e poi avere i metodi tutti static.
    Intendevo che pur essendo due concetti nettamente distinti Singleton e Classe statica si "somigliano":
    - Non sono "istanziabili"
    - l'idea di utilizzo è che molti oggetti possano utilizzare la "stessa istanza" senza passarla come parametro, ma solo importandola
    - vengono utilizzati in modo simile
    es. CalsseStatica.metodo() Singleton.getInstance().metodo();
    La differenza principale è che la classe statica viene inizializzata "Subito ed in ogni caso", mentre il Singleton in modo "Lazy".

    Quindi potrebbero esserci casi in cui entrambi potrebbero essere "sovrapponibili/intercambiabili/entrambiValidi"...
    Ultima modifica di Mrk31; 14-06-2016 a 15:17

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Mrk31 Visualizza il messaggio
    Intendevo che pur essendo due concetti nettamente distinti Singleton e Classe statica si "somigliano":
    - Non sono "istanziabili"
    - l'idea di utilizzo è che molti oggetti possano utilizzare la "stessa istanza" senza passarla come parametro, ma solo importandola
    - vengono utilizzati in modo simile
    es. CalsseStatica.metodo() Singleton.getInstance().metodo();
    La differenza principale è che la classe statica viene inizializzata "Subito ed in ogni caso", mentre il Singleton in modo "Lazy".

    Quindi potrebbero esserci casi in cui entrambi potrebbero essere "sovrapponibili/intercambiabili/entrambiValidi"...
    No.

    Una classe "static" (ripeto: deve essere "membro" di un'altra classe) PUO' essere istanziata.
    Una nested static class ha gli stessi identici principi (stesse regole, stesso ciclo di vita, ecc...) di una classe "top-level" (non contenuta dentro qualcosa). È semplicemente da vedere come se fosse in un "namespace" che è fatto dalla classe top-level che la contiene.

    codice:
    public class TopLevel {
        // ....
    
        public static class Nested {
            // ....
        }
    }

    Per poterla istanziare dall'esterno devi fare: new TopLevel.Nested()

    Tutto qui. Per il resto cambia nulla come regole e concetti.

    P.S. deduco che hai le idee un po' confuse su questo argomento.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2014
    Messaggi
    76
    Quote Originariamente inviata da andbin Visualizza il messaggio
    No.

    Una classe "static" (ripeto: deve essere "membro" di un'altra classe) PUO' essere istanziata.
    Una nested static class ha gli stessi identici principi (stesse regole, stesso ciclo di vita, ecc...) di una classe "top-level" (non contenuta dentro qualcosa). È semplicemente da vedere come se fosse in un "namespace" che è fatto dalla classe top-level che la contiene.

    codice:
    public class TopLevel {
        // ....
    
        public static class Nested {
            // ....
        }
    }

    Per poterla istanziare dall'esterno devi fare: new TopLevel.Nested()

    Tutto qui. Per il resto cambia nulla come regole e concetti.

    P.S. deduco che hai le idee un po' confuse su questo argomento.
    Probabilmente sono tardo , ma ancora non ci arrivo...

    Mettiamo che debba implementare, per esempio, una classe/libreria per avere una serie di metodi di utilità per la cifratura di stringhe:
    -con classe statica:
    codice:
    public static class HashUtils{
       public static String getMd5(String pwd) {
          //Restituisce la stringa cifrata in md5;
       }
    }
    --> Utilizzo:
    codice:
    String ciphredPwd = HashUtils.getMd5(pwd);
    -con Singleton:
    codice:
    public class HashUtils { 
       private static HashUtils instance = null;
    
       private/protected HashUtils() {}
    
       public static HashUtils getInstance() {
          if(instance == null) {
             instance = new HashUtils();
          }
          return instance;
       }
    
       public String getMd5(String pwd) {
          //Restituisce la stringa cifrata in md5;
       }
    }
    --> Utilizzo:
    codice:
    String ciphredPwd = HashUtils.getInstance().getMd5(pwd);
    L'unica differenza è che con il singleton avrei l'inizializzazione "pigra"...
    Ultima modifica di Mrk31; 14-06-2016 a 16:02

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Mrk31 Visualizza il messaggio
    codice:
    public static class HashUtils{
       public static String getMd5(String pwd) {
          //Restituisce la stringa cifrata in md5;
       }
    }
    --> Utilizzo:
    codice:
    String ciphredPwd = HashUtils.getMd5(pwd);
    No. Questa classe HashUtils NON può essere "top level". Dovrebbe essere contenuta dentro un'altra classe. E se lo fosse, l'unica cosa (ripeto l'unica) che cambierebbe è a livello di naming, cioè di qualificazione del nome:

    String ciphredPwd = ClasseTopLevel.HashUtils.getMd5(pwd);


    Quote Originariamente inviata da Mrk31 Visualizza il messaggio
    -con Singleton:
    codice:
    public class HashUtils { 
       private static HashUtils instance = null;
    
       private/protected HashUtils() {}
    
       public static HashUtils getInstance() {
          if(instance == null) {
             instance = new HashUtils();
          }
          return instance;
       }
    
       public String getMd5(String pwd) {
          //Restituisce la stringa cifrata in md5;
       }
    }
    --> Utilizzo:
    codice:
    String ciphredPwd = HashUtils.getInstance().getMd5(pwd);
    L'unica differenza è che con il singleton avrei l'inizializzazione "pigra"...
    Ti ripeto che il concetto del pattern "singleton" non c'entra nulla con la differenza tra una classe "top level" e una "nested" (static).
    Ultima modifica di andbin; 14-06-2016 a 16:27
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Apr 2014
    Messaggi
    76
    Quote Originariamente inviata da andbin Visualizza il messaggio
    No. Questa classe HashUtils NON puo' essere "top level". Dovrebbe essere contenuta dentro un'altra classe. E se lo fosse, l'unica cosa (ripeto l'unica) che cambierebbe e a livello di naming, cioe' di qualificazione del nome:

    String ciphredPwd = ClasseTopLevel.HashUtils.getMd5(pwd);



    Ti ripeto che il concetto del pattern "singleton" non c'entra nulla con la differenza tra una classe "top level" e una "nested" (static).
    Forse non riesco a spiegarmi bene io....

    Io vorrei generare una mia classe di utilita' per delle mie librerie, in modo analogo ad esempio a Math...

    Quindi con un utilizzo del tipo Math.abs() senza istanziare un oggetto Math...

    Pensavo che fosse giusto che una classe con SOLO metodi statici dovesse essere dichiarata statica, ma mi son guardato la API di Math ed in effetti è una classe non-statica final in modo da non poterla estendere, che contiente SOLO metodi statici...

    A questo punto non capisco perchè non ci sia la "regola" (che non conoscevo) di non avere classi Top Level statiche?
    Se una classe ho SOLO metodi statici può non essere per forza dichiarata statica, anzi se è top-level NON DEVE...perchè?
    A sto punto qual'è l'utilità del modificatore static riferito alle classi?

    Il mio paragone con il singleton era in relazione alla domanda: mi serve un modo per richiamare metodi senza avere un'istanza per ogni classe che la utilizza o dover passare l'istanza a tutte le classi, come posso fare?

    In ogni caso ci sono articoli, libri, ecc... che confrontano classi statiche e Singleton e che propongono il singleton come alternativa all'utilizzo di classi statiche, non è una mia invenzione ...

    P.S. per curiosità ho guardato in .Net la classe Math è invece statica...
    Ultima modifica di Mrk31; 14-06-2016 a 17:06

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Mrk31 Visualizza il messaggio
    Pensavo che fosse giusto che una classe con SOLO metodi statici dovesse essere dichiarata statica, ma mi son guardato la API di Math ed in effetti è una classe non-statica final in modo da non poterla estendere, che contiente SOLO metodi statici...
    Appunto.

    Quote Originariamente inviata da Mrk31 Visualizza il messaggio
    A questo punto non capisco perchè non ci sia la "regola" di non avere classi Top Level statiche?
    Pensa: un membro "static" è concettualmente associato alla classe che lo contiene. Se una classe top level potesse essere static, con chi e come c'entrerebbe? Con niente. E quindi non farebbe differenza.

    Quote Originariamente inviata da Mrk31 Visualizza il messaggio
    Se una classe ho SOLO metodi statici può non essere per forza dichiarata statica, anzi se è top-level NON DEVE...perchè?
    L'ho detto al punto prima.

    Quote Originariamente inviata da Mrk31 Visualizza il messaggio
    A sto punto qual'è l'utilità del modificatore static riferito alle classi?
    Una classe nested (static) che è quindi membro di un'altra classe la si usa spesso per rappresentare un sotto-concetto o per implementare una qualche interfaccia usata all'interno della classe top level o altre cose del genere. Anche una enum che è nested dentro una classe è implicitamente static.

    Quote Originariamente inviata da Mrk31 Visualizza il messaggio
    Il mio paragone con il singleton era in relazione alla domanda: mi serve un modo per richiamare metodi senza avere un'istanza per ogni classe che la utilizza o dover passare l'istanza a tutte le classi, come posso fare?
    Conta solo il fatto che il metodo sia static. Non dove sia. Dove sia (se in una classe top level o nested) cambia solo a livello di qualificazione del nome.

    ClasseTopLevel.metodoStatico() oppure ClasseTopLevel.ClasseNested.metodoStatico()

    Quote Originariamente inviata da Mrk31 Visualizza il messaggio
    In ogni caso ci sono articoli, libri, ecc... che confrontano classi statiche e Singleton e che propongono il singleton come alternativa all'utilizzo di classi statiche, non è una mia invenzione ...
    Continuo a ripeterti che il pattern "singleton" non c'entra nulla con top level vs nested.
    Una classe "singleton" (di cui si può ottenere una sola ed unica istanza) la puoi realizzare sia come top level che come nested static class.

    Quote Originariamente inviata da Mrk31 Visualizza il messaggio
    P.S. per curiosità ho guardato in .Net la classe Math è invece statica...
    .Net è sicuramente tutta un'altra cosa .... non facciamo miscugli di linguaggi e piattaforme completamente differenti.
    Ultima modifica di andbin; 14-06-2016 a 17:13
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    Apr 2014
    Messaggi
    76
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Appunto.


    Pensa: un membro "static" è concettualmente associato alla classe che lo contiene. Se una classe top level potesse essere static, con chi e come c'entrerebbe? Con niente. E quindi non farebbe differenza.


    L'ho detto al punto prima.


    Una classe nested (static) che è quindi membro di un'altra classe la si usa spesso per rappresentare un sotto-concetto o per implementare una qualche interfaccia usata all'interno della classe top level o altre cose del genere. Anche una enum che è nested dentro una classe è implicitamente static.


    Conta solo il fatto che il metodo sia static. Non dove sia. Dove sia (se in una classe top level o nested) cambia solo a livello di qualificazione del nome.

    ClasseTopLevel.metodoStatico() oppure ClasseTopLevel.ClasseNested.metodoStatico()


    Continuo a ripeterti che il pattern "singleton" non c'entra nulla con top level vs nested.
    Una classe "singleton" (di cui si può ottenere una sola ed unica istanza) la puoi realizzare sia come top level che come nested static class.


    .Net è sicuramente tutta un'altra cosa .... non facciamo miscugli di linguaggi e piattaforme completamente differenti.
    Ok ho capito che c'è questa "regola" per cui anche se potrei usare classi top-level statiche è meglio utilizzare classe non statica con metodi statici...mentre per le nested va bene che sia statica anche la classe...

    Quello che non capisco è il perchè ci sia questa differenza tra Top-level e nested??? Perchè introdurre questa regola?

    Ne guadagno in termini di prestazioni/ottimizzazione? è semplicemente una convenzione?

    P.S. il confronto col .net era solo per capire se fosse una cosa universalmente nota/accettata o fosse una particolarità di Java...
    Ultima modifica di Mrk31; 14-06-2016 a 17:24

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.