per creare TIPI che in java non esistono. Java ha una libreria immensa di classi già testate e robuste, ovvero tollerante ai guasti. Se noi abbiamo un problema risolvibile con una classe di java già esistente, conviene usare quella e non crearne una da zero. In generale si parla di PROVIDER CLIENT, io sono client della classe che ci fornisce il provider, ovvero java. Il tipo Razionale, per fare dei calcoli precisi con le frazioni, in java non è stato implementato. Il linguaggio java si definisce ESTENDIBILE, perché è sempre possibile creare delle nuove classi all’occorrenza. Gli oggetti della classe Razionale sono IMMUTABILI, una volta definito resta tale. Posso operare tra due razionali, ad esempio facendo l’addizione, però vado sempre creare un nuovo oggetto, i primi due non vengono toccati. In java, quando possibile, è meglio creare classi di oggetti immutabili. Siccome i campi, che costituiscono lo stato della classe, sono immutabili, li imposto come variabili FINAL. Essendo i campi NUM e DEN final (costanti), si potrebbero benissimo rendere public ed evitare così i metodi accessori getNum() e getDen(). Tuttavia: è sempre buona norma evitare di esporre i dettagli sull'organizzazione interna di una classe ai suoi clienti, per non introdurre nei clienti eccessive dipendenze. I setter ovviamente non vanno inseriti. In java una directory equivale ad un package. La directory windows in cui sono contenuti i file java, è un package a tutti gli effetti. I file che appartengono allo stesso package sono familiari tra di loro. Quando usiamo una classe precedentemente sviluppata che non è nello stesso package, bisogna importarla. Quando vado a fare l’operazione di moltiplicazione di due razionali, ottengo una frazione non ridotta ai minimi termini, però nella return io passo dal costruttore Razionale, che mi crea una nuova frazione con il numeratore uguale al prodotto tra i due numeratori delle frazioni moltiplicate (lo stesso per il denominatore) e la riduce ai minimi termini. Ogni volta che si passa dal costruttore viene applicata una semplificazione automatica. La classe Razionale ammette due metodi mul() in overloading il cui uso è chiaramente distinto dal tipo del parametro. La seconda mul() è utile ad es. per ottenere il razionale opposto di un dato razionale: r2=r1.mul(-1); Overloading dei metodi
In una classe Java possono
comparire più metodi (anche costruttori) con lo stesso nome (overloading o metodi “sovraccarichi”). Java richiede che i metodi overloaded siano differenziati dal numero e/o tipi dei parametri in modo che sia sempre univoco distinguere, staticamente, quale metodo va invocato. Java capisce da solo quale metodo utilizzare in base ai parametri che passo al metodo. Quando si scrive una classe java è importante essere CONSISTENTI, ovvero bisogna avere un certo rigore e una certa coerenza nello scrivere i vari metodi. Se due metodi svolgono circa le stesse funzioni, potrebbe essere fonte di equivoci scriverli in modo completamente diverso.
CONCATENAZIONE DELLE INVOCAZIONI DEI METODI
Razionale r1= new
Razionale(14,18); Razionale r2= new Razionale(8,12); Razionale r3= new Razionale(3,9); Razionale ris= r1.add(r2).mul(r3);
il risultato di r1.add(r2) restituisce
un Razionale e su questo razionale posso chiamare mul() che si applica al risultato di add(). Si dice che le invocazioni dei metodi sono state concatenate.
Perché il main è static? Perché
quando mandiamo in esecuzione il programma ancora non abbiamo oggetti, io per creare oggetti devo far partire il programma, ma non ho oggetti inizialmente, quindi l’unica soluzione è battezzarlo static. Il main viene fatto partire sulla classe.
In java un oggetto continua ad
esistere quando c’è qualche variabile che lo punta, se l’oggetto non viene puntato da nulla, diventa parte della garbage collection. Ci sono dei momenti in cui viene attivato il garbage collector che noi non conosciamo, dipende da quanta memoria è ancora disponibile. Entità di classe e entità di classe
● (non static) Variabili come NUM
e DEN nella classe Razionale e metodi come add e sub etc. costituiscono attributi d’istanza, dal momento che hanno rilevanza per ogni singolo oggetto. Tali entità preseppongono l’uso del this. ●(static) Variabili come contaRazionali e metodi come razionaliCreati, costituiscono entità di classe, ossia che hanno rilevanza di classe indipendentemente da qualsiasi istanza. Si rifletta che il loro significato sussiste anche quando nessun oggetto Razionale è stato creato, quindi non si basano su this.