Choose your language
feb 02

Che confusione!
Sui tipi annidati (nested type) e la classi interne (inner classes) in giro per la rete ci sono scritte un sacco di fregnacce! Probabilmente perché la SUN, a partire dalla versione 1.4 di java, ha fatto un po’ di casini con la nomenclatura, modificando il significato di alcuni termini. Comunque sia, ora proviamo a fare chiarezza.
Per prima cosa mettiamo in chiaro un concetto: le definizioni in informatica si danno e si usano in inglese. Ci si può riferire al corrispondente termine italiano per meglio comprendere di cosa si parla, ma è l’inglese che rende univoco un concetto o una definizione.
Torniamo quindi all’Università e alle definizioni :-)

Definizione:
Con il termine nested type (tipi annidati) si intende indicare:

  • nested classes
  • nested enums
  • nested interfaces

Definizione:
Con il termine nested class (classe annidata) si intende una classe dichiarata all’interno di un’altra classe.
Allo stesso modo si definisono le nested enum e le nested interface.
Ci sono 4 tipi di nested classes:

  1. static member classes, enums e interfaces
  2. non-static member classes
  3. local classes
  4. anonymous classes

Definizione:
Con il termine inner class (classe interna) si indica una qualsiasi nested class purché NON di tipo 1 (vedi definizione precedente).

Facciamo un esempio commentato a dovere:

class Alessandro {              // (1) Top level class
    static class SMC {/*...*/}  // (2) Static member class
    interface SMI {/*...*/}     // (3) Static member interface
    class NSMC {/*...*/}        // (4) Non-static member (inner) class
    void nsm() {
        class NSLC {/*...*/}    // (5) Local (inner) class in non-static context
    }
    static void sm() {
        class SLC {/*...*/}     // (6) Local (inner) class in static context
    }
    SMC nsf = new SMC() {       // (7) Anonymous (inner) class in non-static context
        /*...*/
    };
    static SMI sf = new SMI() { // (8) Anonymous (inner) class in static context
        /*...*/
    };
    enum SME {/*...*/}          // (9) Static member enum
}
  • Share/Bookmark
Tagged with:
dic 02

Nuovo sistema, nuovi problemi :-)
Con l’uscita di Karmic Koala sono apparsi anche piccoli bug che però, in taluni casi, danno davvero fastidio! Stiamo parlando di tutti quei software che improvvisamente non accettano più i nostri click sui loro pulsanti. Uno di essi è il mio preferito: eclipse!
Se quindi ci troviamo nella situazione in cui premendo i pulsanti del nostro software preferito non succede assolutamente nulla, allora dobbiamo porre rimedio a manina.
Il rimedio seguirà i seguenti passi:

  1. Creiamo un mini script
  2. Diamo i permessi di esecuzione a tale script
  3. Lanciamo lo script

Posizioniamoci nella cartella in cui si trova l’eseguibile che presenta i problemi di cui sopra (in questo caso specifico eclipse). In tale cartella creiamo il file eclipse.sh e al suo interno scriviamo quanto segue:

#!/bin/sh
export GDK_NATIVE_WINDOWS=true
<path completo>/eclipse

sostituendo ovviamente <path completo> con il proprio path.
Poi da terminale diamo i permessi di esecuzione a tale file, digitando

sudo chmod +x eclipse.sh

Ora lanciamo lo script:

./eclipse

Dovrebbe adesso partire eclipse e i suoi pulsanti dovrebbero funzionare.

  • Share/Bookmark
Tagged with:
dic 02

Ma abbiamo davvero capito come vengono gestiti i reference in java?
Piccolo snippet per metterci alla prova.
Ammettiamo di avere 2 classi

  • ClasseA
  • ClasseB

e che ClasseB sia una sottoclasse di ClasseA ossia “ClasseB extends ClasseA”.
ClassB extends ClassA
Ora, supponendo che le classi si trovino tutte nello stesso package, scriviamo questo codice nel nostro main method:

ClasseA a;
ClasseB b;

a = new ClasseA();
b = new ClasseB();

a = b; //(1)
b = a; //(2)

Problemi?
Il codice scritto funziona? Anzi, compila?
La risposta è, ovviamente, no :-) e il problema è nell’ultima riga (2): b = a;
Perché?
Eppure sembra tutto ok!
In (1) abbiamo assegnato b ad a, quindi a = b. Come è mai possibile che scrivendo poi b = a la cosa non sia corretta?
La spiegazione è nel tipo di dichiarazione iniziale dei reference a e b.
ClasseA è una superclasse di ClasseB, quindi scrivere a = b è possibile per automatico widening (a è “più grande” di b). La cosa invece non è possibile in senso inverso perché b è “più piccolo” di a e non può quindi “contenerlo”.
L’osservazione più comune a questo punto è:
ma se in (1) abbiamo scritto a = b significa che a e b sono diventati uguali! Quindi come è mai possibile che b = a dia problemi? :-)
Già, come è mai possibile?
Leggete il post su java i reference e la RAM e forse ne capirete di più… :-)

  • Share/Bookmark
Tagged with:
nov 19

Molti le nominano, pochi le usano, meno le conoscono.
Eppure sono moderatamente utili e molto semplici da usare…
In java una

assert

è un’affermazione che il programmatore fa in un certo punto del codice da lui scritto.. Il compilatore si occupa di verificare che tale affermazione sia corretta, in caso contrario lancia un’eccezione di tipo unchecked. E’ decisamente opportuno disabilitarle in fase di produzione del sistema, mentre possono essere utili in fase di sviluppo e test.

Come si dichiarano?
In 2 modi diversi:

assert <boolean expression>;
assert <boolean expression>: <message expression>;

Se ad esempio, in una nostra classe stiamo calcolando la velocità come spazio/tempo, potremmo scrivere:

assert spazio > 0;
assert tempo > 0: "Il tempo non è un numero positivo!" + tempo;

Come si abilitano?
Per default le asserzioni sono disabilitate.
Bisogna quindi esplicitamente abilitarle. Ecco come fare:

>java -ea <classe da eseguire></classe>

In questo modo abilitiamo l’uso delle asserzioni nella nostra classe e in tutte le sue dipendenze, ma non nelle classi di sistema (quelle caricate direttamente dalla JVM). Per abilitare anche quelle ci tocca scrivere:

>java -esa

L’errore più clamoroso che si possa commettere nell’uso di una

assert

è quello di confonderla con la gestione delle eccezzioni!

  • Share/Bookmark
Tagged with:
nov 17

Il sistema utilizzato da java per passare parametri ai metodi è molto semplice, eppure nella mia breve storia di programmatore java in molti mi hanno chiesto delucidazioni su questo argomento. In base alla mia esperienza posso dire che avere problemi nel capire come funziona il passaggio dei parametri in java significa avere problemi con reference e dati primitivi.
Quindi, per prima cosa, vi rimando alla lettura di tali post!

Se avete chiara la differenza tra un reference e un dato primitivo, diventa tutto facile.
In java i parametri vengono sempre passati per valore e sempre duplicati con copie locali al metodo.
Dovrebbe però essere chiaro che duplicare una variabile di tipo primitivo è diverso dal duplicare una varibile di tipo reference! Duplicare un reference significa avere 2 reference che puntano allo stesso oggetto! Ecco perché quando in un metodo modifico il valore di un parametro di tipo primitivo esso non modifica il valore del parametro fuori dal metodo, mentre quando uso un parametro di tipo reference ogni modifica apportata all’oggetto puntato da tale reference viene riflessa sull’oggetto puntato dal parametro esterno: entrambi i reference (essendo uno la copia dell’altro) puntano lo stesso oggetto!

  • Share/Bookmark
Tagged with:
nov 12

Ragazzi,
roba da matti! Per avere informazioni esatte su come bisogna muoversi per ottenere questo benedetto voucher, mi è servita tutta la mia fama di “segugio” informatico.

Andiamo con ordine.
Se sto cercando di acquistare il voucher è perché ho deciso di sostenere un esame SUN. Il “luogo” in cui bisogna recarsi per registrarsi, pagare e, in seguito, ottenere il voucher è questo.
Si sceglie l’esame che interessa e si prosegue.
Si, si prosegue fino al passo 3 (Indirizzo per la fatturazione)
fasiSUN
a questo punto se sei un privato, non hai una Partita IVA (campo obbligatorio) e non hai neanche un Numero Ordine (anch’esso campo obbligatorio) sei fregato! Il sistema non ti consente di proseguire e non c’è neanche l’ombra di un aiuto; niente!
Quindi?
Quindi ti inchiodi lì e cerchi di capire come procedere!
Beh, vi risparmio il racconto delle mie avventure alla ricerca delle informazioni su come procedere e vi porto alla soluzione.
Nel campo “Partita IVA” vi basta inserire il vostro Codice Fiscale (ci si poteva arrivare), mentre nel campo “Numero Ordine” vi basta inserire una X. Avete capito bene, una X. E’ un campo che non serve a niente, ma è obbligatorio!

A questo punto, si può terminare la registrazione e procedere con il pagamento dell’esame scelto. Su questo punto tutto sembra abbastanza chiaro: bisogna effettuare un bonifico qui:

BANCA INTESA BCI SPA-RETE CARIPLO-Ag. CINISELLO BALSAMO
c/c 21000129 ABI 03069 CAB 32934
IBAN IT80 H030 6932 9340 0002 1000 129

come correttamente segnalato alla fase 2 della procedura di registrazione.
Non è certo finita!
Bisogna a questo punto recarsi sul sito della Prometric per registrarsi (anche lì).
Ora bisogna attendere il numero del proprio voucher che ci sarà notificato via email dalla SUN. Una volta ottenuto il numerino bello, ci si deve collegare sulla apposita sezione del sito della Prometric e seguire tutto l’iter durante il quale verrà richiesto il numerino bello.
Ad ogni modo, per ogni dubbio, vi consiglio di chiamare il sempre utile numero verde della SUN: 800826108 in orari d’ufficio.

Schematizzando per rendere il tutto più lineare, i passi da seguire per sostenere un esame con SUN sono i seguenti:

  1. Scegliere l’esame e registrarsi qui
  2. Pagare l’importo relativo all’esame scelto
  3. Eseguire il login sul sito Prometric e scegliere data e sede dove si vuole sostenere l’esame
  4. Andare a fare l’esame con Carta d’identità e voucher
  • Share/Bookmark
Tagged with:
nov 01

Non molto tempo fa abbiamo cercato di dipanare la matassa intorno alla gestione dei reference.
In questo post invece cerchiamo di capire come funzionano i dati primitivi nella memoria del PC.
Innanzitutto un dato primitvo NON è un oggetto!
Tuttavia, ogni dato primitivo ha una corrispondente wrapper class che può essere usata per rappresnetarlo come un oggetto. Ma in questo post non parleremo di questo.
Ci occuperemo invece di quali sono i dati primitivi in java e come vengono rappresentati nella RAM del PC.
Possiamo dividere i dati primitivi in 3 categorie:

  • integral types (byte, short, int, long e char)
  • floating-point types (float, double)
  • boolean type (boolean)

E’ lecito scrivere:

int intVar = 10;

Cosa succede nella RAM del PC quando noi scriviamo una tale istruzione?
La figura di seguito dovrebbe spiegarlo.
Il dato primitivo nella RAM
Nella cella di memoria con sfondo verde è stato inserito il valore del nostro tipo primitivo; in questo caso il valore 10. Da adesso in poi ogni istruzione di modifica della variabile intVar modificherà direttamente il valore contenuto in quella cella di memoria. Quindi scrivendo:

intVar = 163;

java modificherà per noi il contenuto della cella in figura.
E’ molto importante notare e capire che java gestisce in modo differente gli oggetti e i dati primitivi.

  • Share/Bookmark
Tagged with:
ott 26

Questo è un argomento ostile, nel quale è facile perdersi, ma nello stesso tempo è la prima porta da aprire se si vuole entrare a pieno titolo nel mondo della programmazione java…

Innanzitutto distinguiamo tra reference value e object reference.
Un reference value rappresenta un valore (value) e precisamente il valore che viene restituto quando viene creato un particolare oggetto.
Un object reference (o semplicemnte reference) rappresenta invece una variabile che può memorizzare un reference value.
Questa differenza deve essere chiara perché altrimenti niente sarà mai chiaro con i reference in java!
Ora traduciamo questi concetti in codice.
Creiamo 2 object reference di tipo MiaClasse:

MiaClasse refOggetto1, refOggetto2;

Scrivendo questa riga di codice abbiamo comunicato a java di creare due variabili (nella RAM del calcolatore) di tipo MiaClasse e gli abbiamo anche detto che in queste 2 variabili DOVRANNO essere inseriti dei valori che si riferiranno (reference) a 2 oggetti di tipo MiaClasse. Stiamo parlando di “reference”! Questo significa che in queste 2 variabili java NON inserirà MAI gli oggetti veri e propri, ma il rifeimento a tali oggetti!!!
Rileggete bene l’ultimo paragrafo: è molto importante!

Bene. Inseriamo allora tali riferimenti ai 2 oggetti:

refOggetto1 = new MiaClasse(1);
refOggetto2 = new MiaClasse(2);

A questo punto java assegna un valore a refOggetto1 e un altro valore a refOggetto2. Ribadisco ancora che tale valore NON indica l’oggetto vero e proprio, ma indica la posizione (in RAM) dell’oggetto; il suo “riferimento”.
Si può rappresentare graficamente quanto detto con la seguente figura (scusate la poca eleganza).

Oggetti in RAM

In questa figura c’è rappresentato tutto quello che bisogna sapere sui reference!
Continue reading “Java, i reference e la RAM” »

  • Share/Bookmark
Tagged with:
ott 10

Di tanto in tanto

capita di dover attivare il protocollo SSL (HTTPS) su Tomcat… Per utilizzare il protocollo sicuro però è necessario un certificato.
La creazione di un certificato “serio” può essere un’operazione complicata. Qui invece vediamo come crearne uno in modo semplice, utile per tutte le operazioni di test di un applicativo.
Pre-condizioni:
tomcat 5.x
jdk 1.x (con x>=4)

Quindi, se abbiamo una versione della jdk maggiore o ugaule alla 1.4 e abbiamo tomcat in una versione maggiore della 5, possiamo creare un certificato in modo abbastanza semplice. Vediamo come.

Uno strumento che sicuramente abbiamo sotto mano per creare dei JKS (Java KeyStore) è keytool che possiamo trovare nella sottocartella bin del nostro JDK. Con questo tool possiamo creare dei certificati semplicemente da riga di comando. Apriamo quindi il command del DOS e procediamo.
Continue reading “Tomcat e HTTPS” »

  • Share/Bookmark
Tagged with:
mag 20

Per modificare la porta del servlet-container (Tomcat) utilizzato da JBOSS, bisogna agire sul file jboss-4.0.5.GAserverdefaultdeployjbossweb-tomcat55.sarserver.xml. Se jboss viene configurato per l’utilizzo di un’altra versione di Tomcat (qui la 5.5) cambieranno gli utlimi 2 numeri del .sar.

  • Share/Bookmark
Tagged with:
preload preload preload

Search engine optimization by SEO Design Solutions