Autore Topic: Costanti  (Letto 1097 volte)

Offline ginoz

  • Nuovo arrivato
  • *
  • Post: 42
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    windows
Costanti
« il: 20 Maggio 2011, 09:42:07 CEST »
0
Nella mia applicazione ho diverse costanti, le ho messe tutte all'interno di una classe come
protected static final tipocostante.

Come gestione della memoria è corretto? La classe viene spesso istanziata, è forse meglio metterle in una classe usata solo come raccoglitore di costanti? O è meglio metterle altrove?

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:Costanti
« Risposta #1 il: 20 Maggio 2011, 10:11:25 CEST »
+3
Essendo la variabile static non puoi mai istanziarla! Crei una istanza della classe, ma non della costante che è già definita e caricata in memoria.

Inoltre essendo la variabile stati final questa effettivamente non esiste a runtime. Al momento della compilazione (più precisamente durante il linking) viene fisicamente sostituita in tutte le parti del codice dove viene richiamata, quindi non hai nessuno speco di memoria, visto che non esistendo non occupa memoria.

Su dove è meglio definire le costanti esistono tantissime filosofie.

Filosofia 1:
in un package "constants" dove il nome della classe indica la tipologia di costanti. Ad esempio nel package com.marcoduff.myapp.constants definisco la mia classe con costruttore vuoto privato Veicolo con dentro le costanti "AUTO, MOTO, BICI".

Filosofia 2:
dentro la classe responsabile delle costanti (dove vengono più usate/dove hanno più senso). Ad esempio hai nella tua Veicolo (questa volta piena di metodi ed instanziabile, definita in un package normale) ti ritrovi anche le costanti "AUTO, MOTO, BICI".

Filosofia 3:
dentro una classe non istanziabile Constants che contiene al suo interno tante altre classi statiche che dividono per tipologia le costanti. Ad esempio la classe Constants dove all'interno è definita la classe statica Veicolo con all'interno le costanti "AUTO, MOTO, BICI".

Da evitare invece (e probabilmente è quello che hai fatto tu...) casi di questo tipo:
ammassare le costanti tutte in una classe Constants generica senza dividerle per tipologia;
definire le costanti con scope package o protected.

Offline ginoz

  • Nuovo arrivato
  • *
  • Post: 42
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    windows
Re:Costanti
« Risposta #2 il: 20 Maggio 2011, 10:52:15 CEST »
0
Citazione
Essendo la variabile static non puoi mai istanziarla!

intendevo che le ho messo dentro una classe instanziabile  non che instanzio la variabile  :-)
In pratica è la "filosofia 2"

Citazione
Filosofia 2:
dentro la classe responsabile delle costanti (dove vengono più usate/dove hanno più senso). Ad esempio hai nella tua Veicolo (questa volta piena di metodi ed instanziabile, definita in un package normale) ti ritrovi anche le costanti "AUTO, MOTO, BICI".

Però gli ho messo lo scope protected.

Codice (Java): [Seleziona]
public class Veicolo {
       
        /**
         *                      CONSTANTS AUTO
         */

       
        protected static final String AUTO_MARCA = "Fiat";
        protected static final String AUTO_TIPO = "500";


 come dovrei invece dichiararle?

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:Costanti
« Risposta #3 il: 20 Maggio 2011, 11:07:25 CEST »
0
Fammi storcere un poco il naso... so che è un esempio, ma proprio per questo sarò molto pignolo!

Dentro una classe Veicolo hai definito un AUTO_MARCA e AUTO_TIPO che più che costanti sembrano essere variabili che hanno sempre lo stesso valore!

Una struttura precisa sarebbe questa:
Codice (Java): [Seleziona]
package com.marcoduff.test;

public final class Veicolo {
        private Veicolo() {} // Rendo la classe non instanziabile
       
        public static final class Fiat {
                public static final int CINQUECENTO = 0;
                public static final int BRAVO = 1;
        }

        public static final class Ford {
                public static final int FOCUS = 0;
                public static final int FIESTA = 1;
        }
}

che se noti è molto simile a quella famosa autogenerata nella classe R. ;)

Offline ginoz

  • Nuovo arrivato
  • *
  • Post: 42
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    windows
Re:Costanti
« Risposta #4 il: 20 Maggio 2011, 15:21:40 CEST »
0
Quelle costanti facevano un po' schifo anche a me, ma al momento l'esempio mi è venuto così :-)

Ultima domanda, come mai sconsigli lo scope protected?

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:Costanti
« Risposta #5 il: 20 Maggio 2011, 15:25:54 CEST »
0
Ultima domanda, come mai sconsigli lo scope protected?

Mi puzza dover limitare in questo modo l'utilizzo di una costante... e se crei una classe che logicamente sta in un altro package ( addirittura progetto) che deve usare un servizio che si aspetta in input quella costante come fai?

Ovvio è che, se quella costante ha soltanto senso in un limitato gruppo di classi (o anche in una singola classe) allora va benissimo l'uso dello scope protected o private.