venerdì 20 febbraio 2015

[JAVA] Variabili e dichiarazioni


Si definisce variabile l'insieme di un nome simbolico, detto anche identificatore, e un indirizzo di memoria che contiene una determinata quantità, detta comunemente valore della variabile.

Dichiarazione delle variabili

In Java, ogni variabile ha associato anche un tipo (come Integer, String, Boolean, etc.) che definisce le caratteristiche che avranno i valori che la variabile potrà assumere.
Ad esempio una variabile di tipo Integer potrà contenere il valore 42 ma non il testo quarantadue.

La sintassi per la dichiarazione di una variabile in Java è la seguente:

[public|protected|private] [static] [final] Tipo identificatore [= value];

dove le parti tra parentesi quadre ‘[]‘ sono opzionali ed il simbolo pipe ‘|‘ deve essere letto “oppure”.

Nomi delle variabili

L’identificatore (nome) di una variabile è una sequenza di lettere e cifre il cui primo elemento deve essere una lettera oppure il carattere underscore (‘_‘) o ancora il carattere dollaro (‘$‘).

Vige comunque la convenzione (non regola sintattica) che i nomi delle variabili inizino con unalettera minuscola e, qualora formati da più parole concatenate, tutte le parole successive alla prima siano capitalizzate e non vengano usati i simboli _ e $ nonostante siano ammessi. Ad esempio:

int nomeDellaVariabileIntera;

Per i nomi dei tipi, ovvero per le classi, la convenzione prevede invece che la prima lettera sia maiuscola):

class LaMiaClasse


L’identificatore può essere una qualsiasi stringa ma esistono alcune parole riservare del linguaggio che non possono essere utilizzate come identificatori:



Tipi di variabili

In Java si distinguono tre tipi di variabili: 

- variabili locali 
- variabili di istanza 
- variabili di classe.


Variabili Locali

Le variabili locali sono quelle la cui dichiarazione avviene all’interno di un metodo.
Le variabili locali sono create quando un metodo viene chiamato e scompaiono (vengono cancellate dalla memoria) quando il metodo termina.
Ogni variabile dichiarata all’interno del metodo può essere utilizzata solamente all’interno del metodo stesso ed in Java le variabili locali non possono essere utilizzate prima della loro inizializzazione.

Per esempio, se provassimo a compilare il seguente metodo:





il compilatore Java ci darebbe un messaggio di errore perchè la variabile j non è stata inizializzata prima del suo uso e non è quindi possibile aggiungere un valore alla variabile fino a che a questa non sia stato assegnato un valore.

Il codice seguente sarebbe invece compilato senza alcun errore:




Nell’esecuzione di questo frammento di codice, la macchina virtuale Java crea in memoria lo spazio per registrare le variabili locali i e j, per poi cancellarle (liberando lo spazio in memoria) alla fine dell’esecuzione del metodo add.

Scope di una variabile

Si definisce scope di una variabile, l’area del codice nel quale un identificatore resta associato ad un indirizzo di memoria (e quindi l’area di codice entro il quale una variabile mantiene il suo valore).
In Java ogni bloccodefinisce uno scope e ogni variabile locale ha come scope l’area di codice che inizia dalla definizione della variabile stessa e termina con il blocco corrente.



Variabili di istanza

Le variabili di istanza, anche note come field o campi, sono dichiarate all’interno di una classe ma all’esterno di ogni metodo.

I field hanno come scope l’intero corpo della classe in cui sono dichiarati, compresi i metodi della classe stessa. Quindi sono visibili all’interno di tutti i metodi della classe.
Può succedere che una variabile locale in un metodo (oppure il parametro di un metodo) abbia lo stesso nome (identificatore) di una variabile di istanza. In questo caso ha la precedenza la variabile più specifica, cioè la variabile locale o il parametro.

Per esempio (cliccare per ingrandire):



Un’istanza di una variabile (non statica) continua ad esistere nella memoria di un programma fino a quando esiste l’oggetto che la contiene (ed un oggetto “rimane in vita” fino a quando ne esiste almeno una referenza, quindi una variabile associata ad esso).

Variabili di classe (static)

Le variabili di classe infine, comunemente dette anche static field o campi statici, sono variabili di istanza ma nella loro definizione viene usata la keyword ‘static’.

static int var = 6; 

Una variabile di classe è una variabile visibile da tutte le istanze di quell’oggetto ed il suo valore non cambia da istanza ad istanza, per questo appartiene trasversalmente a tutta la classe.
Mentre per le variabili di istanza viene allocata una nuova locazione di memoria per ogni istanza di una classe, per le variabili statiche esiste una unica locazione di memoria legata alla classe e non associata ad ogni singola istanza.
Una variabile di classe, statica, vive (cioè mantiene occupata la memoria e continua a mantenere il suo valore) fino al termine del programma.

Modificatori di visibilità: public, private, protected, default

Le variabili di istanza e di classe possono essere ulteriormente qualificate per mezzo delle keywords public e private che ne determinano la visibilità all’esterno della classe in cui sono dichiarate.

Se utilizziamo la keyword private una variabile sarà visibile (accessibile, utilizzabile per far riferimento al suo indirizzo di memoria e quindi al suo valore) solamente all’interno della classe.
  
Se qualificheremo la variabile come public indicheremo al compilatore che la variabile potrà essere utilizzata da qualsiasi parte del codice in cui ci sia una istanza della classe (con la notazione idIstanzaClasse.nomeVariabile). 

Protected significa che la variabile sarà accessibile da ogni altra classe che appartiene al medesimo package della classe che contiene la variabile e da ogni classe che ne deriva (la estende). 

Se non specifichiamo un qualificatore di visibilità, la variabile sarà lasciata con la visibilità di default che in Java signifca che sarà accessibile solo da tutte le classi nel medesimo package.

Variabili final e static final

Si usa la keyword final per dichiarare una variabile che potrà essere inizializzata una sola volta, sia nella fase di dichiarazione o attraverso una successiva assegnazione.
Al contrario delle costanti, il valore delle variabili final non è necesariamente noto a compile-time ma il loro indirizzo di memoria può essere inizializzato una sola volta rendendone possibile l’utilizzo in alcuni contesti in cui sarebbe impossibile utilizzare le normali variabili locali.
In Java si definiscono costanti le variabili che vengono qualificate contemporaneamente come final e static: è convenzione che i nomi delle variabili final siano in maiuscolo e se il nome è costituito da più parole, queste vengano separate dal carattere underscore (‘_‘);

domenica 1 febbraio 2015

[ANDROID] Funzionamento di base di un'applicazione


Le applicazioni Android, affidano sue funzionalità a quattro tipi di componenti. Si tratta di Activity, Service, Content Provider e BroadcastReceiver.


Activity 

è un’interfaccia utente. Ogni volta che si usa un’app generalmente si interagisce con una o più “pagine” mediante le quali si consultano dati o si immettono input. La realizzazione di Activity è il punto di partenza di ogni corso di programmazione Android visto che è il componente con cui l’utente ha il contatto più diretto.


Service 
svolge un ruolo opposto all’Activity. Rappresenta un lavoro che viene svolto interamente in background senza bisogno di interazione diretta con l’utente. I Service hanno un’importanza
basilare nella programmazione proprio perchè spesso preparano i dati che le activity devono mostrare all’utente permettendo una reattività maggiore nel momento della visualizzazione.


Content Provider 
nasce con lo scopo della condivisione di dati tra applicazioni. La sua finalità è quella di dare sicurezza, Questi componenti permettono di condividere, nell’ambito del sistema, contenuti custoditi in un database, su file o reperibili mediante accessi in Rete. Tali contenuti potranno essere usati da altre applicazioni senza invadere lo spazio di memoria ma stabilendo quel dialogo “sano” cui si è accennato.


Broadcast Receiver 
è un componente che reagisce ad un invio di messaggi a livello di sistema con cui Android notifica l’avvenimento di un determinato evento, ad esempio l’arrivo di un SMS o di una chiamata o sollecita l’esecuzione di azioni. Questi componenti sono particolarmente utili per la gestione istantanea di determinate circostanze speciali.

Molto importante ricordare che una componente può attivarne un’altra mediante apposite invocazioni di sistema. Questa intenzione viene codificata con un Intent utilizzabile come normale classe Java ma che sottintende un potentissimo strumento di comunicazione di Android.