Newsgroup: it.comp.java
Titolo: Variabili static

Ciao a tutti
Ho un problema (spero stupido) che mi sta facendo perdere un sacco di
tempo e che vorrei proporvi sperando che qualcuno possa aiutarmi a
risolverlo.
Ho una classe: MiaClasseBase, che possiede un attributo static:
mioAttributo. Da questa classe voglio derivare varie altre classi:
MiaClasseBase1, MiaClasseBase2, etc.. Io vorrei che il valore di
mioAttributo di ciascuna delle classi derivate fosse diverso, invece se
eseguo ad esempio: MiaClasseBase1.setMioAttributo(xxx) setto il valore
di mioAttributo anche nelle altre. E' possibile riuscire ad avere valori
diversi di mioAttributo nelle varie classi derivate oppure in Java non
c'e' verso? Mi sembra che in Smalltalk il comportamento normale fosse
che ogni classe derivata possedesse una "istanza" propria della
variabile ma non ne sono certo.
Qualsiasi aiuto sara' ben accetto
Grazie
Matteo Castellucci

Matteo Castellucci wrote:

"static" fa proprio questo, condivide un attributo fra le varie istanze.
Basta toglierlo, oppure non ho capito bene il problema. Vuoi fare uno static
a livello "gerarchico" e basta? Che cioè possa esser condivso solo da
istanze della stessa classe ma non di sottoclassi? In questo caso pensa si
debba rivedere il design
--
Ugo
__________________________________________________________________________
"La perfezione si ottiene non quando non c'è nient'altro da aggiungere,
 bensì quando non c'è più niente da togliere." Antoine de Saint-Exupéry
__________________________________________________________________________
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Enterprise Java Consulting
@mail: Ugo.L...@Flashnet.it
Home Page: 
http://www.ugolandini.net
Mentoring: 
http://www.projectoo.com
Work Phone: 02/61860647-6-4 06/58332267
Cell Phone: 0347/6310749 - 0347/4783580
Fax Phone: 02/700 413 187
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Si ammetto di non essere stato molto chiaro. La questione e' che voglio creare
una serie di classi. Tutte queste classi hanno un attributo di classe (static)
identico. Ora io avevo pensato di creare una classe padre dove definire
l'attributo una volta per tutte e speravo di assegnare valori diversi
dell'attributo alle varie classi, cosa invece non possibile a quanto pare. In
altre parole io avevo scritto:
class A {
    static String attr;
    public static void setAttr(String unaStringa) { attr = unaStringa; }
    public static String getAttr() { return attr; }
}
class B extends A { ... }
class C extends A { ... }
se eseguo:
    B.setAttr("pippo");
    C.setAttr("pluto");
    B.getAttr();
ottengo "pluto" mentre io vorrei ottenere "pippo".
Ora mi chiedo: in Java esiste un modo per ottenere questo senza dover definire
la variabile (con get e set annessi) in tutte le classi ove mi serve????
Ugo Landini wrote:

--
========================================================
Matteo Castellucci
Project Manager
Ubiquity S.r.l. 
http://www.ubiquity.it
Via Teodosio 65   20131 Milan - Italy
Direct: 
+39 02  28858430
  Main: 
+39 02 288584
.1
Cell:   
+39 348 3014859
   Fax:  
+39 02 2829795
Email:  
mcas...@ubiquity.it
========================================================

...


 la variabile (con get e set annessi) in tutte le classi ove mi serve????
Il tipo di variabili di cui parli, ossia delle varibili di cui viene creata
automaticamente una diversa istanza per ogni sottoclasse, non esistono, che
io sappia, in nessun linguaggio, sicuramente non nei più comuni linguaggi
OO. E non fa differenza se si tratta di varibili statiche o normali dati
della classe. Le variabili rappresentano zone di memoria gestite dalla
classe e sono, giustamente, interamente sotto il controllo del
programmatore, senza che il compilatore si prenda l'arbitrio di creare
istanze non esplicitamente richieste, come accadrebbe nel caso da te
prospettato.
Il meccanismo del polimorfismo si basa sui metodi e non sulle
variabili, e richiede sempre l'overloading del metodo. Per quanto riguarda i
metodi statici, l'unico linguaggio che conosca che permetta la definizione
di metodi statici virtuali è Delphi, mentre in Java tali metodi non
esistono. La ridefinizione di variabili della classe, statiche o meno, è
possibile, ma mi sembra più che altro un modo per creare confusione e
moltiplicare le possibilità d'errore. In conclusione la "feature" da te
ipotizzata non esiste e, a mio parere, è bene che non esista.
Tuttavia effettivamente in certe circostanze può far comodo avere delle
variabili statiche, quindi condivise da tutte le istanze di una classe, ma
differenziate per le varie sottoclassi, come appunto nel tuo caso. La cosa
si
può risolvere con una classe di supporto che implementa due funzioni
statiche get e set che accedono a una hashtable statica usando come chiave
il nome della classe:
public class Attributes
{
     private static Hashtable sAttributes;
     private static void createHashtable()
     {
         sAttributes = new Hashtable();
         set(Base.class, "base attribute");
         set(SubOne.class, "sub1 attribute");
         set(SubTwo.class, "sub2 attribute");
     }
     public static String get(Class aClass)
     {
          if (sAttributes == null)
              createHashtable();
          return (String)sAttributes.get(aClass.getName());
     }
     public static void set(Class aClass, String aString)
     {
          if (sAttributes == null)
              createHashtable();
          sAttributes.put(aClass.getName(), aString);
     }
}
Il metodo privato createHashtable() si occupa di inizializzare gli attributi
per ciascuna classe (ho chiamato le classi Base, SubOne, SubTwo), ma i
valori potrebbero anche essere assegnati dall'esterno, a seconda delle
esigenze.
Questo sistema può essere usato sia per classi della stessa gerarchia sia
per classi di gerarchie differenti. Nella classe base possono anche essere
implementati dei metodi *non* statici che permettono di accedere agli
attributi in maniera piu snella, ma solo a partire da una *istanza* di una
qualunque classe della gerarchia:
class Base
{
    public String getAttribute()
    {
        return Attributes.get(getClass());
    }
    public void setAttribute(String aValue)
    {
        Attribute.set(getClass(), aValue);
    }
}