Newsgroup: it.comp.java
Titolo: Modificatore final per le variabili e assegnazione del valore

Si può mettere il modificatore final ad una variabile assegnandogli 
però successivamente il valore? Oppure è possible ottenere un effetto 
analogo? Esempio:
public static final boolean FLAG;
public MyClass(boolean b)
{
    FLAG = b;
}
Ovviamente così mi dà errore, ma vorrei poter assegnare il valore di 
una variabile statica e pubblica successivamente alla sua 
inizializzazione, ad esempio in base ai parametri inseriti a console, e 
mettendola final in modo che non possa essere modificata da chiunque..
Grazie.


Final è fatto apposta per *evitare* questo. Puoi solo inizializzare la
variabile al momento della sua dichiarazione, per esempio così:
private boolean hiddenFlag;
// fai quello che vuoi con l'hidden flag
public final boolean FLAG = hiddenFlag;

 }
Puoi dichiarare una variabile final e inizializzarla nel costruttore ( se 
non la inizializzi nella dichiarazione devi farlo obbligatoriamente nel 
costruttore.
Se perň questa stessa variabile la dichiari ANCHE statica, allora non puoi 
piů inizializzarla nel costruttore, ma devi farlo alla dichiarazione :-))
Le variabili statiche infatti sono a livello di classe, e non di istanza... 
che senso avrebbe inizializzarle nel costruttore? ;-)

Direi che pensandoci meglio avete perfettamente ragione, ho detto una 
castroneria immane..
Quello che volevo fare era fare un'applicazione che partisse in 
modalità grafica o, eventualmente con l'opzione -console, a riga di 
comando. E quindi l'idea di un qualcosa di statico da consultare ogni 
volta che c'è da stampare un println mi sembrava una buona idea, ma mi 
rendo conto che non è possibile mettere un flag sia statico che finale.
A sto punto forse mi conviene mettere una variabile console finale in 
ogni classe e propagare il valore, mediante i costruttori, partendo dal 
main a tutte le calssi che devono stampare qualcosa a video, così da 
poter consultare il valore ogni volta senza mettere nulla di statico, 
non vedo altre soluzioni.. Voi che dite?

 non vedo altre soluzioni.. Voi che dite?
Pessimo.

gnurant scriveva il 10/04/2007 :

D'accordo, tui come faresti in alternativa?

Aperius (10/04/2007 22:34:14):

--- suggerimento 1
Se esiste una console a caratteri associata al processo che contiene la
tua applicazione Java, il metodo
  java.lang.System.console()
ti restituisce un oggetto di tipo java.io.Console, altrimenti ti
restituisce null (come quando avvii l'applicazione tramite javaw).
Sulla Console ci puoi fare un po' quello che vuoi: scriverci con
printf(), leggervi con readLine() ... vedi un po' te :D
Ah, solo con jdk1.6.0
--- suggerimento 2
Se vuoi un flag, a volte la staticità è necessaria... Metti nella tua
classe principale una cosa del tipo
public class MainClass {
   ...
   private static boolean hasConsole=false
   ...
   public static void main(String[] args) {
      //Qui la inizializzi dopo aver parsificato i
      //parametri da linea di comando
   }
   //la cambi solo con metodi statici della classe e poi...
   public static void printConsole(String text) {
      if (!hasConsole) return;
      ...
      //pensaci un po' te stavolta
   }
}
e poi dalle altre classi fai:
   ...
   MainClass.printConsole("blah blah blah...");
   ...
ovviamente sei libero di cambiare i nomi dei metodi
HTH
-- 
Scientology: se la conosci la eviti, se la conosci non ti uccide...
http://xenu.com-it.net
 - 
http://xenu.freewinds.cx
 - 
http://www.xenu.net
(per rispondere personalmente leva IlDitoDalCulo)
http://www.webalice.it/ech3l0n/HastaLaVictoria.jpg
   -   Siempre!

non ho capito cosa devi fare .... 

 non è possibile mettere un flag sia statico che finale.
Scusa ma non basta, come ti hanno già anche suggerito, peraltro, un flag 
static NON final? Perché lo vuoi final?
Lo inizializzi nella classe Main, e poi lo usi (o come dice 
OcchioDiDrago con un metodo printConsole, oppure anche con un metodo più 
generico, sempre statico, hasConsole che ti ritorna il valore del flag).
bye
DKano

 D'accordo, tui come faresti in alternativa?
Dipende quello che devi fare:
1) pensi di riuscire a disegnare bene un'applicazione che funzioni sia
con GUI che con CLI? Che tipo di applicazione è? [ chiaramente la
risposta è in molti casi 'si' a seconda della tipologia di applicazione
]
2) È davvero importante che funzioni in entrambi i casi? Ha le stesse
funzionalità? In un caso è un batch nell'altro no? Quando è in modalità
testuale è comunque interattiva?
3) Non è che per caso tutto quello che a te interessa è avere in pratica
un 'Logger' che se sei attaccato ad una console stampa li, se non lo sei
o non fa nulla o logga su un file di log?
Nel caso tre, la cosa migliore che puoi fare è costruirti un oggetto
Logger (singleton, o magari tutta roba statica, vedi un pò). O prenderne
uno già fatto. E la logica del stampa/non-stampa/dove-stampa la metti
tutta li dentro e chissene.
-- 
blog:  
http://www.akropolix.net/rik0/blogs
 | Uccidete i filosofi,
site:  
http://www.akropolix.net/rik0/
      | tenetevi riso e
forum: 
http://www.akropolix.net/forum/
     | bacchette per voi.

 tutta li dentro e chissene.
Concordo in pieno, mi pare che per questo vada bene anche il log 
standard dalla 1.4 in su; mi ricordo che tempo fa feci un "robo" che 
scriveva il log sia su file che su una TextArea usando proprio le classi 
standard. Non mi ricordo come, però, perché è passato un mucchio di 
tempo, in pratica era appena uscita la 1.4. Ricordo però che non ho 
impiegato molto a farlo e la documentazione javadoc era molto esauriente.
bye
DKano

 un pò
Mi sto vergognando profondamente.


 > un pň
Mi sto vergognando profondamente.
Cioč, l'errore č mio, nel post prima.


OcchioDiDrago ha usato la sua tastiera per scrivere :

Grazie, in effetti non avevo pensato di fare un metodo statico, è una 
soluzione molto brillante.. Seguirà il tuo consiglio. Non posso usare 
la classe Console perchè sono costretto a lavorare ancora con la 1.5_10

 tutta li dentro e chissene.
Ma si, in realtà la modalità grafica avrà una veste particolare, mentre 
quella a console sarà solo un log a println con un minimo di menù.. 
comunque credo di aver risolto con il suggerimento del metodo statico, 
grazie..

 Cioè, l'errore è mio, nel post prima.
Ma va là! Figurati..

Dopo dura riflessione, DKano ha scritto :

Effettivamente a me serviva un logger ma non eccessivamente evoluto, 
comunque non sapevo dell'esistenza di singleton, sarà da qualche mese 
che sto imparando java..

DKano ha pensato forte :

Sisi infatti va bene quello, l'essere final era solo per non renderlo 
modificabile una volta che l'applicazione era partita, per sicurezza 
come mi hanno sempre spiegato..
Grazie, a tutti per le risposte. :-)

 che sto imparando java..
Beh, i design Pattern un pochetto prescindono dal linguaggio.
Addirittura in molti linguaggi di alto livello sono cose talmente
scontate che non c'è nemmeno bisogno di dare loro un nome, mentre in
linguaggi di livello medio o medio basso hanno bisogno di un minimo di
costruzione software e diventano 'interessanti'.


> D'accordo, tui come faresti in alternativa?
E'OF> Dipende quello che devi fare:
E'OF> 1) pensi di riuscire a disegnare bene un'applicazione che
E'OF> funzioni sia con GUI che con CLI?
Fischio se è possibile. Basta pensare all'interfaccia come un qualcosa
di separato dall'applicazione.
Anni  fa  in  dipartimento  compilai  per un  professore  un  tool  di
progettazione HW che era essenzialmente a linea di comando e poi aveva
una  interfaccia  grafica  separata   che  parlava  con  il  programma
principale via pipe. Ora in  una applicaizione Java non ti è richiesto
usare  la  pipe  per  farlo,  ma  il  concetto  è  quello,  il  motore
dell'applicazione  e l'interfaccia  utente si  parlano  attraverso una
interfaccia (programmatoria).
-- 
                                                    Gian
                                           Friends will be friends
                                              right to the end!

 di separato dall'applicazione.
Chiaramente è possibile. Ma non tutte le applicazioni si prestano a
questo tipo di giochetto. 
Cioè stiamo facendo discorsi su due livelli. Il tuo è a livello di
*programmazione*. Ovvero è ovvio[0] avere la logica dell'applicazione
separata dall'interfaccia grafica. Questo viene tendenzialmente scontato
dall'usare un approccio di tipo MVC (o al limite anche MVC semplificato
con un quasi collassamento di V e C). 
In questo caso è vero che cambiando View (ed eventualmente modificando
il controller a seconda delle API della libreria utilizzata, che
potrebbero non essere 'isomorfe') la faccenda funziona.
Io sto però parlando ad un livello di *funzionalità*. Cioè non è vero
che tutte le funzionalità che vengono ovvie/comode in un modello a
command line siano ovvie/comode a livello di GUI.
Ci sono esempi di applicazioni che funzionano meglio con un approccio a
command line (e quando vengono trasposte in GUI in pratica non viene
fatto altro che fornire una maschera che 'mima' l'approccio della CLI),
altre che vengono meglio in GUI (tipicamente quelle più interattive).
In generale progettare un'interfaccia *utente* che funzioni bene sia per
GUI che per CLI non è banale (mentre è relativamente banale fra GUI
diverse, alla fine è solo questione di cambiare la programmazione sotto,
ma quello che si presenta all'utente è lo stesso). Sono mezzi diversi.
Per questo è più difficile.
----
[0] o per lo meno dovrebbe, in effetti VB è un tipico esempio che non è
affatto ovvio per tutti.


> qualcosa di separato dall'applicazione.
E'OF> Chiaramente è possibile. Ma non tutte le applicazioni si
E'OF> prestano a questo tipo di giochetto.
È solo questione di come vengono pensate.
E'OF> Io sto però parlando ad un livello di *funzionalità*. Cioè non è
E'OF> vero che tutte le funzionalità che vengono ovvie/comode in un
E'OF> modello a command line siano ovvie/comode a livello di GUI.
Principalmente è  una questione  di abitudine e  di come  è progettata
l'interfaccia utente. Ma stiamo andando OT rispetto a Java...
-- 
 /\           ___
/___/\_|_|\_|__|___Gian Uberto Lauri_____
  //--\| | \|  |   Integralista GNUslamico
\/                 e coltivatore diretto di Software
A Cesare avrei detto di scrivermi a 
fn...@rat.vg