Index


Interfacce notevoli

Sono classi notevoli anche Iterator

oss

Clonable non crea una deep copy ma solo una shallow copy Python Alias, Shallow and Deep copy

Altra interfaccia utile:

Interfaccia Runnable

interfaccia che implementa un solo metodo run() che permette di creare thread che permette di eseguire un metodo in modo separato dal resto del programma

public interface Runnable{
	void run()
}

Le enumerazioni possono estendere le interfacce


metodo clone()

clone() appartiene all’interfaccia cloneable e permette di fare una shallow copy di un oggetto, questo significa che quando l’oggetto ha come capi dei riferimenti (puntatori) crea dei problemi (ovvero non viene effettuata la creazione di un nuovo riferimento, quindi i riferimenti dell’oggetto originale e della copia punteranno allo stesso riferimento )

oss

x.clone() != x sarà sempre vero

Utilizzo

clone() per esse utilizzati deve essere implementato oppure verrà ritornato l’errore CloneNotSupportedException

Sovrascrivere clone()

Classi top level

  • Non sono contenute in altre classi
  • Questo tipo di classi richiede un file .java dedicato con lo stesso nome della classe che esso contiene

Classic annidate (nested class)

  • classi all’interno di altre classi

Esistono 2 tipi:

  • static

  • non-static in questo caso vengono dette classi interne (inner class)

  • Prima di poter creare un oggetto della classe interna è necessario istanziare la classe esterna (top-level) che la contiene

  • Ciascuna classe interna, infatti, ha un riferimento implicito all’oggetto della classe che la contiene

  • Dalla classe interna è possibile accedere a tutte le variabili e a tutti i metodi della classe esterna

  • Come tutti i membri di una classe, le classi interne possono essere dichiarate public, protected o private

Esempio:


Static nested class


Classi anonime

  • classi senza nome che permettono di implementare un interfaccia o di estendere una classe

Syntax:

TipoDaEstendere unicoRiferimentoOggetto = new TipoDaEstendere(){
	//codice della classe anonima
};

Esempio:


Interfacce funzionali

  • In Java 8 è disponibile una nuova annotazione @FunctionalInterface
  • L’annotazione garantisce che l’interfaccia sia dotata esattamente di un solo metodo astratto

Esempio:

@functionalInterface
public interface Runnable{
	void run();
}

Espressioni Lambda

  • Presenti da java 8
  • Tali espressioni creano oggetti anonimi assegnabili a riferimenti a interfacce funzionali compatibili con l’intestazione (input/output) della funzione creata.

Syntax:

(parameters) -> { code block }

Tip

  • Il tipo dei parametri si può omettere
  • return si può omettere
  • se c’e un solo parametro in input si possono omettere le tonde
  • le graffe si possono omettere solo se il cose block è du una sola riga

How to make and run a lambda object:

Runnable obName = (parameters)  -> { code block };
obName.run(input);

Example:

Runnable r = () -> { System.out.println(ʺhello, lambda!ʺ); };
r.run(); // stampa ʺhello, lambda!ʺ

It can be used in a for

 ArrayList<Integer> numbers = new ArrayList<Integer>();
    numbers.add(5);
    numbers.add(9);
    numbers.add(8);
    numbers.add(1);
    numbers.forEach( (n) -> { System.out.println(n); } );

Altri esempi: