Docsity
Docsity

Prepara i tuoi esami
Prepara i tuoi esami

Studia grazie alle numerose risorse presenti su Docsity


Ottieni i punti per scaricare
Ottieni i punti per scaricare

Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium


Guide e consigli
Guide e consigli


biglietto teoria programmazione 3 in java, Schemi e mappe concettuali di Programmazione Java

risposte a varie domande teoriche programmazione java

Tipologia: Schemi e mappe concettuali

2021/2022

Caricato il 28/02/2023

anita-greco
anita-greco 🇮🇹

5 documenti

1 / 10

Toggle sidebar

Questa pagina non è visibile nell’anteprima

Non perderti parti importanti!

bg1
BINDING.
è il legame tra il nome di un metodo che andiamo ad invocare e il codice che viene eseguito.
Nei linguaggi tradizionali (come il C) viene risolto dal compilatore, mentre in java viene risolto
dinamicamente, cioè la classe di un oggetto determina dinamicamente quale versione del metodo
verrà applicata, cioè viene definito dal tipo di oggetto e dai parametri passati nel metodo
Per le variabili di istanza non c e il binding dinamico, c e solo per i metodi
NON LO DIRE quindi anche se ho variabili con lo stesso nome in sottoclassi, io se la uso
normalmente (aka senza mettere sottoclasse.variabile) mi riferisco alla variabile del mio metodo.
MVC PATTERN.
Organizza l’architettura delle applicazioni che hanno un interfaccia grafica in componenti, cosi da
renderli più modulari e separare le attività tra modello, view e controller
La view si occupa dell’interazione con l’utente, gestisce l’interfaccia utente, visualizza i dati del
model e comunica col controller
Il controller prende i dati che gli vengono inviati dalla view, quindi input utente più situazione
attuale della vista, li rielabora se necessario e li manda al Model. Traduce poi la risposta del model
in modo da renderla comprensibile alla vista
Il Model contiene i dati salvati e lo stato dell’applicazione. Quando riceve richieste dal controller le
esegue e aggiorna il suo stato interno. Può trasmettere il risultato direttamente alla view o al
controller.
È spesso usato in coppia con observer e observable perchè cosi posso disaccoppiare meglio le
classi. Cosi i cambiamenti nel modello verranno presi dalla vista tramite gli observer
I vantaggi sono che le classi del nostro programma possono essere riusate più facilmente, il
programma è diviso in parti più piccole e più facili quindi da comprendere, e la modifica di una
parte influenza di meno il resto del programma.
OBSERVER OBSERVABLE
Un oggetto Observer osserva più oggetto Observable registrandosi presso questi oggetti. Quando
un oggetto Observable modifica il proprio stato, notifica il cambiamento a tutti gli Observer
registrati presso di lui, eseguendo il metodo update() degli oggetti Observer.
Observer è un'interfaccia che contiene il metodo update(Observable obj, Object extra_arg)
che viene chiamato ogni volta che l'oggetto observable è modificato.
Observable è una classe che fornisce i metodi
addObserver(Observer) aggiunge l'Observer o all'insieme degli osservatori di questo
oggetto
setChanged() marca questo oggetto, indicando che il suo stato è cambiato
notifyObservers(Object arg) se questo oggetto ha cambiato stato, notifica tutti i suoi
osservatori chiamando il loro metodo update() . I due argomenti di update() sono questo
oggetto e l'oggetto arg.
notifyObservers() come sopra, ma il secondo argomento di update è null.
Bigliettone orale
Pag. 1 / 10
pf3
pf4
pf5
pf8
pf9
pfa

Anteprima parziale del testo

Scarica biglietto teoria programmazione 3 in java e più Schemi e mappe concettuali in PDF di Programmazione Java solo su Docsity!

BINDING.

è il legame tra il nome di un metodo che andiamo ad invocare e il codice che viene eseguito.

Nei linguaggi tradizionali (come il C) viene risolto dal compilatore, mentre in java viene risolto dinamicamente, cioè la classe di un oggetto determina dinamicamente quale versione del metodo verrà applicata, cioè viene definito dal tipo di oggetto e dai parametri passati nel metodo

Per le variabili di istanza non c e il binding dinamico, c e solo per i metodi

NON LO DIRE quindi anche se ho variabili con lo stesso nome in sottoclassi, io se la uso normalmente (aka senza mettere sottoclasse.variabile) mi riferisco alla variabile del mio metodo.

MVC PATTERN.

Organizza l’architettura delle applicazioni che hanno un interfaccia grafica in componenti, cosi da renderli più modulari e separare le attività tra modello, view e controller

La view si occupa dell’interazione con l’utente, gestisce l’interfaccia utente, visualizza i dati del model e comunica col controller

Il controller prende i dati che gli vengono inviati dalla view, quindi input utente più situazione attuale della vista, li rielabora se necessario e li manda al Model. Traduce poi la risposta del model in modo da renderla comprensibile alla vista

Il Model contiene i dati salvati e lo stato dell’applicazione. Quando riceve richieste dal controller le esegue e aggiorna il suo stato interno. Può trasmettere il risultato direttamente alla view o al controller.

È spesso usato in coppia con observer e observable perchè cosi posso disaccoppiare meglio le classi. Cosi i cambiamenti nel modello verranno presi dalla vista tramite gli observer

I vantaggi sono che le classi del nostro programma possono essere riusate più facilmente, il programma è diviso in parti più piccole e più facili quindi da comprendere, e la modifica di una parte influenza di meno il resto del programma.

OBSERVER OBSERVABLE

Un oggetto Observer osserva più oggetto Observable registrandosi presso questi oggetti. Quando un oggetto Observable modifica il proprio stato, notifica il cambiamento a tutti gli Observer registrati presso di lui, eseguendo il metodo update() degli oggetti Observer.

Observer è un'interfaccia che contiene il metodo update(Observable obj, Object extra_arg) che viene chiamato ogni volta che l'oggetto observable è modificato.

Observable è una classe che fornisce i metodi

addObserver(Observer) aggiunge l'Observer o all'insieme degli osservatori di questo oggetto setChanged() marca questo oggetto, indicando che il suo stato è cambiato notifyObservers(Object arg) se questo oggetto ha cambiato stato, notifica tutti i suoi osservatori chiamando il loro metodo update(). I due argomenti di update() sono questo oggetto e l'oggetto arg. notifyObservers() come sopra, ma il secondo argomento di update è null.

LIVELLI DI VISIBILITA.

Private = è visibile solo all’interno della classe a cui appartiene Protected = è visibile al package della classe Public = è visibile a tutte le classi esterne

Information leakage = non usare correttamente i livelli di visibilità, quindi non fare information hiding e rendere disponibili delle informazioni che non dovrebbero essere accessibili.

SINCRONIZZAZIONE THREAD.

I thread condividono le risorse, quindi è necessario sincronizzare la loro esecuzione. Si può usare ad esempio synchronized per rendere un’istanza condivisa di un oggetto o una funzione disponibile solo in mutua esclusione.

Java associa un lock a ogni oggetto della classe e uno alla classe, usato per sincronizzare ad esempio i metodi statici

Si possono anche usare i lock (noi abbiamo visto anche i reentrant lock) e i semafori.

Si può usare la funzione join() per bloccare l esecuzione del thread che la usa fin quando il thread specificato non avrà terminato la sua esecuzione. Bisogna usarla ovviamente solo dopo che il thread è partito.

L’esecuzione di un thread può essere sospesa con la wait e ripresa con una notify / notifyAll riprende le esecuzioni di tutti i thread in wait.

Nel caso pero due thread si aspettino l’uno con l'altro, ma nessuno riesce a sbloccarsi, si ha una situazione di deadlock. Se un thread invece è in attesa del rilascio di un lock da parte di un altro che pero non lo rilascia mai allora si verifica starvation.

Con un pipe io non devo sincronizzare esplicitamente produttore e consumatore, la sincronizzazione avviene in automatico.

SEMAFORI.

È una modalità di sincronizzazione di thread per l’accesso a risorse. Posso far accedere più thread ad una risorsa se voglio con i semafori. Per entrare in un semaforo si usa aquire() e per rilasciarlo si usa release(). Di solito la release viene fatta nel finally di un blocco try catch, perchè senno in caso di errori il thread manterrebbe la risorsa.

Un thread rimane in attesa al semaforo se non è più possibile accederci.

Si usano anche le interfaccie BlockingQueue (che definisce una coda sincronizzata, in cui quando la coda è piena il thread che cerca di scrivere viene messo in attesa, e quando la coda è vuota il thread che cerca di leggere viene messo in attesa) mentre l interfaccia Lock usa lock() e unlock() in modo esplicito e Condition usa await e signal, simili alla wait e notify.

L interfaccia ReadWriteLock specifica 2 metodi readLock() e writeLock() , che possono essere rispettivamente tenuti da n lettori e da un solo scrittore. Può causare pero starvation nei confronti degli scrittori.

POLIMORFISMO, cast, overloading, overriding.

ReentrantLock, differenza rispetto a lock delle classi (synchronized)

Il ReentrantLock usa lock e unlock esplicitamente tramite istanza del lock stesso, il synchronized é un lock implicito che puó essere usato in una funzione o istanza (per l'esecuzione di una sezione critica) di una qualsiasi classe. Nel synchronized non ci sono metodi espliciti per richiamare lock e unlock, essi vengono richiamati implicitamente all'inizio e alla fine della sezione di codice interessata. Java associa un lock ad ogni oggetto della classe (piú un lock alla classe per sincronizzare i metodi statici).

DIFFERENZA THREAD E PROCESSI.

Ogni processo ha il suo PID, i thread invece no, inoltre quando un processo viene creato gli viene assegnato uno spazio di memoria indipendente, e quindi non può accedere a quello di un altro processo.

I thread invece appartengono ad un processo e condividono le risorse del processo a cui appartengono durante la loro esecuzione. I thread inoltre condividono le risorse nell’heap mentre i processi dopo essere stati creati nel creano una loro copia

ECCEZIONI CONTROLLATE E NON.

Se una porzione di codice puó generare un'eccezione, bisogna racchiuderla in un blocco try e gestire le eccezioni nel seguente blocco catch. Per una migliore gestione degli errori, di solito i catch gestiscono a vari livelli le eccezioni, partendo da uno specifico e scendendo a uno più generale, in modo da non farne sfuggire. Le eccezioni non gestite vengono segnalate dal compilatore o interrompono l'esecuzione del programma. Si possono creare funzioni che potrebbero generare eccezioni aggiungendo "throws" seguito dal nome della classe dell'eccezione nella firma della funzione. Si possono creare classi di eccezioni estendendo la classe Exception.

Gli Error indicano errori del sistema (es. out of memory) mentre le eccezioni errori causati dal programma.

DIFFERENZE PIPE e SOCKET.

Le pipe possono essere utilizzate per la comunicazione tra due processi sulla stessa macchina, di solito tra processo padre e figlio.

I socket mettono in comunicazione uno (diversi processi) o due host, usano IPv4 o IPv6 e numero di porta per stabilire la connessione. Il client richiede la connessone a un server, e se la richiesta è accettata si collegano. Un thread può gestire ogni connessione. Gli oggetti passati mantengono il loro vero tipo.

PUNTI SALIENTI PROGRAMMAZIONE OO.

Ogni oggetto "definisce" un'entitá sotto forma di attributi o proprietá e funzioni. É facile riprodurre quello che si vuole in uno schema top-down che favorisce l'organizzazione, gestione, modularitá e riuso del codice.

Importante è l’incapsulamento, lo stato dell’oggetto appartiene all’oggetto e un utente esterno non può manipolare direttamente lo stato di un oggetto.

Lo stato dell’oggetto è l’insieme di ciò che forma l’oggetto: variabili, metodi ecc

Altrettanto importante è la delega, chi fa la richiesta non deve sapere come viene fatta di preciso (black boxing)

Ogni oggetto ha un tipo (classe) , ogni cosa è un oggetto e un programma è un insieme di oggetti di cui invochiamo i metodi

I vantaggi dell’ OO sono riuso, maggiore leggibilità, dimensioni ridotte, estensione e modifica piu semplici, compatibilità, portabilità, manutenzione del software semplificata, migliore gestione del team di lavoro.

Non serve più conoscere tutto il software, ma solo l’interfaccia delle classi.

MAVEN.

É uno strumento di gestione di progetti software basati su Java e build automation.

Utilizza un file XML che descrive le dipendenze fra il progetto e le varie versioni di librerie necessarie nonché le dipendenze fra di esse. Effettua automaticamente il download di librerie Java e plug-in Maven dai vari repository definiti scaricandoli in locale o in un repository centralizzato.

WILDCARD.

La vildcard è identificata dal? , e si usa quando non si sa che tipo di parametri passare ad una funzione. I può pero specificare se è un istanza di una classe o sopraclasse con <? Super Classe>

Non può essere usato nelle dichiarazioni delle variabili

EVENT ADAPTER.

Siccome le interfacce di molti tipo di listener specificano molti metodi per gestire tanti tipi di eventi noi dovremmo svilupparli tutti anche se non ci servono. Gli adapters danno implementazioni di tutti questi metodi, anche se non fanno nulla e noi poi Overrideamo quelli che ci servono.

Noi quindi estendiamo la classe adapter che ci serve e overridiamo i metodi che ci servono, e per il polimorfismo saranno i nostri a eseguire.

MODULO KERNEL.

Struttura comunemente usata nelle librerie. Si ha un "kernel" che mette a disposizione un'interfaccia che l'utente puó implementare in classi/moduli le cui istanze verranno a loro volta possibilmente usate da altre classi dichiarate e implementate nel kernel.

Permette compilazione separata del codice nel "kernel" e il codice presente nei "moduli".

COSA E UN THREAD E IL SUO CICLO DI VITA.

Thread, ovvero un light weight process, vengono chiamati processi leggeri perché al contrario dei normali processi condividono spazio di indirizzamento ed area dati.

La programmazzione parallela ovvero la programmazione multi-thread introduce un nuovo ostacolo, ovvero, la gestione della concorrenza. Meccanismo di esecuzione dei task. Quando uno o più Thread lavorano con la stessa risorsa è necessario gestire la concorrenza per evitare problemi di insistenza dati.

Ogni volta che si definisce un tipo generico, il compilatore lo trasforma con una operazione in un tipo grezzo (raw type). Tutte le variabili di tipo che compaiono nella definizione della classe generica sono sostituite con Object.

Ad esempio il tipo grezzo di Pair(T first, T second) è Pair(Object first, Object Second).

Si possono usare i termini "implements" o "extends" per poter specificare se la classe dell'istanza del parametro estende una classe e/o implementa una o piú interfacce.

METODI E VARIABILI STATISTICHE (o globali) o d

istanza.

Variabili di istanza: servono per memorizzare lo stato degli oggetti, ogni oggetto ha la sua copia della variabile di istanza nella heap

Variabili di classe, o statiche (static) : c'é una unica copia della variabile per la classe ed é condivisa tra tutti gli oggetti.

Un metodo statico appartiene alla classe e quindi non è parte di nessun oggetto.

Non ha accesso alle variabili d'istanza di nessun oggetto.

Un metodo statico può essere invocato anche se non esiste alcun oggetto della classe.

SOCKET.

È una astrazione software che rappresenta il terminale di una connessione tra due computer.

Il client effettua la richiesta di una connessione ad un server per un servizio collegato ad una determinata porta.

Se la richiesta è accettata la connessione tra i due applicativi dei due computer è stabilita.

Da ogni socket è possibile ottenere uno stream di input ed uno di output, in Java è possibile utilizzare stream di oggetti tramite socket con gli stream ObjectInputStream e ObjectOutputStream

(Gli oggetti devono implementare l’interfaccia java.io.Serializable)

ServerSocket --> Il metodo accept() si mette in attesa di una richiesta di connessione da un socket client

ECCEZIONI.

L’eccezione è un errore del programma che noi gestiamo in modo da non far dare errore al compilatore.

Il costrutto throw permette di lanciare eccezioni, Le eccezioni sono degli oggetti il cui sta il loro stato ci dice le informazioni sul motivo dell’errore.

Le eccezioni sono passate all'indietro da un metodo al suo chiamante fino a quando si trova exception handler che la cattura e la gestisce riprendendo l'esecuzione.

TRY-CATCH --> Se all'interno del blocco try si verifica una eccezione non viene eseguito il rimanente codice del blocco try. Se l'eccezione sollevata è del tipo gestito nel catch, si esegue il codice del blocco catch e si riprende l'esecuzione dall'istruzione che segue la try...catch altrimenti Se l'eccezione sollevata NON è del tipo gestito nel catch, il metodo che contiene la try...catch termina immediatamente, il suo frame viene disallocato e l'esecuzione viene passata indietro al suo chiamante.

È possibile definire le proprie eccezioni

Le eccezioni non controllate (arrayIndexOutOfBound) dovrebbero non avvenire perchè sono evitabili con un buon programma.

COME VENGONO GESTITI I THREAD CON WAIT,

NOTIFY, NOTIFYALL.

Spesso un thread non può eseguire un metodo sincronizzato, anche se ha ottenuto il possesso del lock, perché deve aspettare che si verifichi una qualche condizione che non dipende da lui.

Per non occupare inutilmente la CPU aspettando, il thread deve rilasciare il lock, mettendosi in attesa della condizione, eseguendo il metodo wait(), in modo che un altro thread possa entrare e realizzare la condizione. Quando un thread realizza la condizione, avvisa, eseguendo notify() o notifyAll() , la notify avvisa un Thread in maniera casuale dalla lista di wait (Può portare al deadlock), la notifyAll invece avvisa tutti i Thread in lista di wait.

Per ogni oggetto ci sono due liste di thread:

Lista del lock: contiene i thread in attesa di acquisire il lock dell’oggetto Lista di wait: contiene i thread che sono in wait su quell’oggetto.

Ricordiamo che un thread è blocked se sta eseguendo una sleep, un’operazione di IO o si trova in una di queste due liste

GERARCHIA DI CLASSI PER FARE INPUT-OUTPUT.

Le operazioni di I/O avvengono attraverso stream (principalmente sequenze di bytes)

La Classe OutputStream ha come sottoclassi --> FileOutputStream, PipedOutputStream, ByteArrayOutputStream

La Classe InputStream ha come sottoclassi --> FileInputStream, PipedInputStream, ByteArrayInputStream, StringBufferInputStream

Per ottimizzare i tempi di accesso ad una risorsa è opportuno leggere e scrivere molti caratteri in una sola volta e memorizzarli in un buffer --> le classi BufferedReader e BufferedWriter per usare buffer in lettura e scrittura.

L'oggetto Scanner impostato su un file permette di analizzare il contenuto di una linea del file.

L'oggetto PrintWriter invece permette di scrivere su un File.

JAVA REFLECTION.

Modo per ottenere a run time informazioni su campi, metodi e costruttori. È utilizzato dal package java.reflect che fa usare i metodi getFields, getMethods, getConstructors

È grazie ad essa che quando faccio un cast posso prevenire eccezioni

Utilizzano metodi tipo getVariabile e setVariabile per accedere a dei valori, delle properties, che fanno parte del java bean

Vedi properties java FX sopra