Ciao, questo è il numero romano.
Ora diamo un'occhiata alle classi anonime.
Vedremo anche come viene utilizzato in pratica e estenderemo la demo precedente per questo in
questa conferenza.
Una classe anonima come suggerisce il nome è fondamentalmente anonima.
Questo è che non ha nessuno per capire la classe anonima.
Consideriamo questo costruttore di Cresap che prende come input un concorrente.
E sappiamo che il concorrente ha un'interfaccia che ha il confronto del metodo astratto che conosciamo rispetto
agli argomenti e aiuta a mantenere l'ordine di selezione in tal senso.
Sappiamo che possiamo definire Garces concreti che implementerebbero l'interfaccia della concorrenza.
Tuttavia, possiamo anche utilizzare classi anonime per implementare l'interfaccia di confronto.
Ed ecco come è fatto.
Stiamo creando un'istanza di Chrisette e l'argomento del costruttore di reset è un'istanza di
una classe anonima che sta implementando l'interfaccia della concorrenza.
Dal momento che stiamo creando un'istanza l'argomento nei gruppi la nuova parola chiave che è
seguita dalla dichiarazione di classe anonima che inizia con un concorrente M ed è seguita da parentesi
vuota mentre stiamo creando un'istanza di loro parentesi è seguita dal corpo reale di la classe anonima che inizia.
E quindi è proprio come una normale classe o interfaccia e all'interno del corpo viene fornita l'implementazione per
il metodo Compare che utilizza la lunghezza delle stringhe di input come criterio di ordinamento, come potete vedere qui non c'è
un nome di classe separato.
Stiamo utilizzando il nome dell'interfaccia concorrente Ritchson che implicherebbe di per sé che stiamo
implementando un'interfaccia concorrente.
Quindi la classe anonima è diversa dalla nostra regolare implementazione dell'interfaccia.
VB avrebbe un nome di classe seguito dalla parola chiave implements che a sua volta sarebbe
seguita dal nome dell'interfaccia.
Quindi possiamo vedere che con una classe anonima la stiamo dichiarando e istanziando al punto
di utilizzo e possiamo farlo ovunque.
Un'espressione è legale ma di solito è usata come argomento di metodo come vediamo qui.
Nota che il tuo concorrente è un'interfaccia ma può anche essere di classe.
E se questa classe include un parametro di costruzione, la dichiarazione della
classe anonima può richiamare il costruttore passando gli argomenti necessari che verrebbero specificati tra parentesi.
Quindi questa intera espressione che abbiamo qui può essere letta come un oggetto di una classe anonima
ereditata da un concorrente e sotto il cofano.
Questo è esattamente ciò che sta accadendo.
Quello è il compilatore creerà una classe di toplevel separata corrispondente alla classe anonima e quella classe
implementerebbe il codice di byte del suono dell'interfaccia della concorrenza.
Non esiste e solo la classe nidificata deve essere rappresentata da una classe di livello superiore.
Come menzionato in precedenza, tali classi anonime che vengono create come classi di livello superiore dovrebbero avere nomi di classe
come il dollaro esterno esaurito o il dollaro e così via.
Questo è il nome della classe unclosing sotto il nome della classe che sarebbe seguita
dall'implementazione o dall'eccellenza di Hiebert a seconda che la classe anonima stia ereditando da un'interfaccia o da una classe.
Quindi in realtà non c'è abbastanza classe.
Sarebbe implicitamente rappresentato dal fatto che la classe inferiore della classe superiore sarebbe istanziata nella
classe superiore.
Questo vale per tutte le master class e non solo e su base MUST.
È solo che con altre classi gnostiche il nome della classe nidificata sarebbe il nome della classe esterna dollaro
in un nome di classe, ma con la classe anonima sarebbe il nome di una classe esterna Dollaro un numero un uso
comune delle classi anonime è per la creazione di oggetti funzione.
L'implementazione della concorrenza che abbiamo appena visto era un esempio di oggetto funzione e un
oggetto funzione ha due proprietà associate.
Uno è che i suoi metodi operano su altri oggetti.
Quindi quello sarebbe un oggetto funzione che non soddisfa i parametri sono altri oggetti in un'implementazione
competitiva.
E la notte precedente in cui il concorrente ha operato anche in putzing, la seconda proprietà ottiene che un
oggetto funzione esporta solo un metodo.
Quindi un oggetto funzione è fondamentalmente un'istanza di un tubo con queste due proprietà.
E il tipo può essere una classe o un'interfaccia se è un'interfaccia.
Ci riferiamo all'interfaccia come interfaccia funzionale abbiamo brevemente discusso l'interfaccia funzionale nel capitolo quando si
parla di mugger di default.
Quindi un'interfaccia competitiva è anche un'interfaccia di funzione.
Tuttavia fa come più di un metodo puoi vedere nelle specifiche API del concorrente.
Ma si qualifica ancora come interfaccia funzionale in quanto ha solo un confronto di metodo astratto.
Ha anche un'altra questione astratta uguale alle sottoclassi di Butson che ereditano il metodo di uguaglianza.
Per loro la classe dell'oggetto l'interfaccia competitiva sarebbe comunque considerata come un'interfaccia opzionale.
Quindi gli oggetti funzione possono essere implementati come classi anonime.
Possono anche essere implementati tramite espressioni lambda di cui parleremo più avanti.
Questo uso dell'uso di classi anonime per oggetti funzione è raccomandato anche in questo
articolo per lui o per Kujawa che dice usa oggetti funzione per rappresentare strategie come nel modello Strategia nel nostro esempio
nella diapositiva precedente che il metodo comparato ha definito la strategia di comparazione lunghezza delle stringhe di
input per risolvere gli elementi della creatura.
OK, questa era la strategia.
E possiamo usare altre classi anonime per dichiarare altre strategie.
Il concorrente di per sé sarebbe indicato come interfaccia di strategia e le classi anonime che lo
implementano sarebbero le classi di strategia concrete.
Quindi le classi anonime sono utili per definire gli oggetti funzione mentre le classi membro non
statiche che abbiamo visto in precedenza sono valide per la definizione dell'adattatore in quella demo che costruiremo SHOCKLEE
Bubel implementerà un oggetto funzione utilizzando un Gus anonimo.
Non consideriamo le migliori pratiche quando si lavora con classi anonime.
Uno è che le definizioni di classi anonime dovrebbero essere sparate con scadenze inferiori.
Altrimenti influenzerà la leggibilità.
Questo è effettivamente raccomandato e ho intenzione di fare un Java efficace.
Sulla precedente su oggetti funzione Wallstrom elemento 21 da fare e consiglia anche.
Un'altra cosa che sappiamo che le classi anonime sono dichiarate non sono istanziate nel punto di utilizzo.
Quindi un oggetto anonimo viene creato ogni volta che viene eseguita un'espressione di classe anonima.
E se l'espressione verrà eseguita frequentemente, creeremo anche oggetti che potrebbero
essere molto costosi.
In questi casi possiamo usarlo ma leggo statico final free o dichiaro e istanziamo la classe anonima come
vediamo qui.
Ma questo unico oggetto anonimo verrà creato e possiamo riutilizzarlo semplicemente usando la sensazione.
In questo caso possiamo passare il nome del file SDR sottolineato il concorrente underscore lunghezza
come argomento al costruttore greco non che l'argomento pipe sulla destra è sottolineato finanziamento indiretto e questo
perché non può essere dedotto.
Nel caso di un processo onesto in cui la posizione del diamante non funziona con un processo
on-must, non funziona in Bargello 7 l'8 luglio e potrebbe essere supportato in future missioni.
Si noti inoltre che la fine della classe anonima in questo caso è seguita da un punto e virgola.
Ecco perché qui abbiamo una dichiarazione in piena regola.
Quindi è richiesto il punto e virgola.
Un altro vantaggio di questo approccio è che possiamo anche avere un bel nome descrittivo per il
campo che indica Vawter e sulla clausola must in realtà qui SDR sottolinea che il concorrente underscore
fa che il confronto è basato sulla lunghezza delle stringhe di input che altre strategie
possono essere rappresentato con altri nomi descrittivi.
Non che una classe anonima possa accedere alla classe che lo include se e solo se la classe anonima di
cursing e non-strike contestualizza cosa vuol dire se la classe anonima è dichiarata all'interno di un metodo statico allora non
sarebbe possibile per la classe anonima accedere ad un membro di istanza della classe
che lo contiene.
Non avrà accesso all'oggetto di classe che lo contiene.
Questo perché è dichiarato all'interno di un magor statico.
Ma se è dichiarato in un metodo di istanza, non sarebbe un problema.
Questo è l'oggetto di classe anonimo.
Cosa come.
Accesso all'oggetto che racchiude mantenendo un riferimento nascosto.
Proprio come nel caso di una classe membro non statica, Hensick sarà in grado di accedere al membro
dell'istanza dell'oggetto esterno.
Come dice Anonimo senza nome, non può essere chiamato costruttore.
Tuttavia può avere un inizializzatore di istanza per inizializzare qualsiasi variabile.
Ora andiamo avanti e facciamo un breve periodo di pausa e sul necessario incrocio ritorneremo e
vedremo alcune limitazioni.
Off and on the must process ok in tutti loro.
Estenderemo il programma di cassa che abbiamo scritto la volta precedente.
OK, avevamo i contanti e avevamo anche dei segnalibri per mantenere il denaro contante.
Ora una cosa che ho fatto qui e il segnalibro è che ho aggiunto questa nuova variabile di istanza chiamata valutazione.
Prima avevamo l'ID e il titolo.
Quindi stiamo introducendo la classificazione e ha anche metodi incerti getter e gli encashed sono Java.
Si può ricordare che stavamo creando tutti questi segnalibri e aggiungendoli alla cache che lo stava
memorizzando in un segnalibro.
OK, questa è la cache.
Quindi qui stiamo impostando quella valutazione.
Quindi è solo colpito per il primo oggetto o ne fa uno per il secondo due tre quattro e cinque.
OK, così nella demo precedente abbiamo implementato un adattatore usando una classe membro non statica.
Quindi qui useremo la classe anonima per implementare un oggetto funzione.
In questo caso l'oggetto funzione avrebbe effettivamente cercato questi elementi.
Questi cinque elementi nel segnalibro possono essere ordinati per valutazione.
OK, quindi sarebbe l'oggetto funzione e useremo e dobbiamo solo essere e l'ordinamento
sarà un ordine decrescente.
OK, quindi usano una funzione e sulle classi.
Quindi qui li stiamo aggiungendo.
Quindi per poter ordinare useremo solo gli array metodo iStock cercato.
E abbiamo bisogno di
passare gli articoli ottenere oggetti d'arte il socket che sta implementando il concorrente ed è gentrificato.
Quindi cerchiamo solo i segnalibri e abbiamo bisogno di una parentesi vuota.
E aprire e chiudere la parentesi graffa e abbiamo bisogno di implementare il metodo non implementato che è comparabile.
OK qui viene confrontato a prendere due parametri o segnalibro uno e segnalibro due.
Quindi sarebbe un oggetto funzione.
Quindi lasciami copiare la logica qui.
OK.
Quindi stiamo solo prendendo il rating e ci stiamo confrontando con il rating del secondo parametro.
Dal momento che abbiamo bisogno di iniziare in un'equazione di ordine discendente di un altro, potresti ottenere un A meno un guadagno.
Credo che tu non ricordi.
Puoi semplicemente consultare le specifiche API per vedere come deve essere implementato il Compair.
Quindi questo è tutto.
E a parte questo qui stiamo semplicemente stampando la valutazione e prima stavamo semplicemente iterando tutti gli articoli ora sinceramente
sarebbero in ordine discendente dai diademi di valutazione che verrebbero stampati in
e nell'ordine inverso.
Immagino che quello che intendo sia gestirlo è abbastanza chiaro.
Quindi eccolo qui.
Quindi ecco come l'output della demo precedente.
Semplicemente stiamo semplicemente stampando tutti gli elementi nella cache dei combattenti.
Quindi ora stiamo stampando in ordine inverso e in ordine decrescente di valutazione.
OK.
Ecco perché vedrai che l'hosting virtuale su un Tom-Kat che era l'ultimo in precedenza è
veloce qui.
Quindi ci sono visualizzati nell'ordine inverso del rating.
Ora abbiamo anche detto che se questa parte di funzionalità qui viene segnalata per essere utilizzata
invece di creare un oggetto ogni volta possiamo definirlo.
La classe anonima.
Ma lo stack Iwate è diminuito completamente.
Quindi questo è quello che stiamo facendo qui.
Quindi il tipo di riferimento è stato eliminato dal segnalibro e stiamo usando un nome descrittivo che
indica il concorrente di underscore e il resto del codice è simile.
OK.
Quindi immagino che la sola cosa sia solo per mostrarti ragazzi che ho incluso anche questo blocker di inizializzazione dell'istanza.
OK.
E ricorda che qui c'è questo punto e virgola perché questa è una normale dichiarazione.
OK, lasciatemi commentare qui.
Ed ecco come questo invocare il metodo saut di usare quella valutazione sottolinea il campo competitivo sull'output
sarebbe ancora lo stesso.
È solo che qui abbiamo l'inizializzatore dell'istanza visualizzato perché ho una dichiarazione di stampa qui.
OK, eccolo qui.
Quindi non possiamo non avere un costruttore qui chiamato costruttore.
Possiamo solo avere inizializzatori di istanza che inizializzano alcune variabili.
Ora oltre a questo il terzo che voglio mostrare è qui
che ho creato una classe chiamata foobar.
Ha una variabile d'istanza variabile protetta y su foobar è una classe e ha un costruttore che
intraprende un intervallo X e semplicemente firma y con X.
OK, questo è solo sicuro che possiamo anche averne una classe anonima per implementare una classe.
Quindi questo è quello che stiamo facendo qui.
Foobar e stiamo passando per te.
Quindi stai invocando un costruttore di foobar che il valore 5 e abbiamo questo metodo chiamato Go.
OK.
E qui stiamo semplicemente stampando il valore della vita.
Quindi, perché un prodotto, ad esempio, è variabile nella baracche del fallo.
OK lascia che ti riporti qui.
Ecco qui.
E questo è il costruttore e questa è la variabile.
Quindi torniamo indietro e puoi vedere che viene creata un'istanza.
OK.
A questo punto un buon metodo non è ancora stato invocato.
Quindi stiamo mettendo un operatore punto qui e stiamo invocando il capo.
Quindi potrebbe sembrare un po 'strano l'affermazione, ma stiamo semplicemente creando un oggetto di foobar e
stiamo cercando di eseguire la metrica, quindi lascia che ti accada anche come puoi vedere che è stata Dinda come ti piace.
OK, quindi si tratta di ereditare da una classe.
Ora nella demo precedente avevamo la classe membro statica, che era il mio caso
dopo che implementava l'interfaccia cashola.
Ora dentro questo.
Quindi, come ho commentato questo, ho commentato tutto questo, so come tutto questo ha funzionato in precedenza
e l'hanno fatto alla mia terza volta stavamo creando un'istanza di questa particolare classe
e stavamo riuscendo a ottenerla.
Ma ora volevo solo dimostrare che possiamo anche implementarlo come classe anonima.
Quindi dentro quello lo ha fatto.
Puoi vedere quella directory creando un'istanza dell'interfaccia skosh iterator.
Perché questa è una classe anonima e abbiamo lo stesso corpo qui.
E lo stiamo assegnando ai contanti.
Un regista questo è un tipo di riferimento.
Quindi non c'è più Mike che avrei dovuto fare come è stato sostituito ma questo e questo è quello che abbiamo.
Quindi è già lì e l'abbiamo già eseguito.
Quindi sta funzionando bene ora.
Qui gli elementi sono l'ID del segnalibro in modo che possiamo vedere che possiamo accedere alle variabili di istanza degli elementi di classe che racchiudono
come parte del denaro.
E per fare ciò che sta succedendo sta andando a creare una classe separata per
questo.
Il compilatore creerà una classe toplevel separata per questo, ma il costruttore su di esso passerà
un riferimento al riferimento dell'oggetto off cache all'oggetto Cache alla classe appena creata e solo must
che è maggiore come una classe cappella.
Quindi questo riferimento sarà passato e usando quello accederà agli articoli.
Quindi se vediamo qui qui è sulla nostra scrivania, così possiamo vedere che ha creato tutte queste classi che sono presenti
nel cast di Must Must e una cast in cast.
Quindi volevo solo dimostrarlo.
Quindi possiamo accedere e all'interno di quella classe utilizzerà questo riferimento.
Userà che finirà per istruirci articoli.
OK, questa è una cosa.
E l'ultima cosa che voglio mostrare è.
Quindi questo è un metodo.
E all'interno di questo metodo lo stiamo facendo sui muskrats.
Ora se vogliamo accedere a qualsiasi variabile locale, ad esempio, è solo che chiameremo.
E se vogliamo semplicemente accedervi qui e in questo modo diciamo che questa variabile deve essere dichiarata
definitiva.
OK, deve essere definitivo entro o entro l'8 luglio.
Deve avere questa parola chiave attributo dispositivo finale un errore di compilazione.
Ora in Java 8 non è necessario essere definitivo ma non dovrebbe esserlo.
Non dovrebbe essere modificato in nessun punto all'interno dello scopo di questa metrica.
OK.
E chiamaci semplicemente per scoprire che è ciò che significa che funziona.
Può funzionare bene così è l'8 luglio.
Non abbiamo bisogno della parola chiave, ma diciamo se incrementarla qui.
Quindi dà una compilation o qui dice che la variabile locale può essere definita in uno scopo non conclusivo
deve essere finale o effettivamente definitiva.
Quindi possiamo farlo.
E la ragione di ciò sembra essere solo per semplicità, perché a volte questo carattere di istanza dell'iter di cache può essere
passato ad un altro metodo o ad un altro thread.
E indovina quale multithreading.
E ciò sarà eseguito in una differenza in un altro stack.
Ma qui potremmo incrementare il valore corrente in questo modo nel qual caso potrebbe esserci la necessità di incrementare
il conteggio e quello all'interno dell'oggetto di classe anonimo.
Quindi quello sarebbe lo scenario che finirò probabilmente solo per semplicità.
Non vogliono farlo.
Quindi lo hanno reso definitivo, ma una cosa è questa che può essere restituita.
Qui sono come in questo caso.
Quindi ha questo effetto è una variabile di istanza.
Se si tratta di una variabile come elementi che è una variabile di istanza nella classe di chiusura, allora va
bene perché si accede a questi elementi usando il calore sotto gli amici.
Ma poiché questo è un metodo locale, qui è un metodo e questa è una variabile locale nell'ambito di questa
variabile.
E con il metodo, ma l'oggetto stesso è un po 'lo scopo.
E quindi non possiamo usare quello riferimento per accedere a questa variabile.
Quindi per quella ragione ne farà una copia.
Il compilatore farà una copia di questo codice e lo farà in modo dentale nel processo nucleare di primo
livello che crea.
Crea una variabile separata per il codice e ha i segni W2 che il codice Kaluga è così che
è stato implementato internamente.
Quindi è solo per tua informazione.
Quindi questo è tutto.
Ora torniamo al minimo per osservare i limiti, non le emendazioni di carburante per missili e
sulla base.
Uno è ovviamente non possiamo ereditare dai tipi di mercato.
Questo è che non possiamo implementare più interfacce.
Allo stesso modo non possiamo estendere una classe allo stesso tempo implementare un'interfaccia prossima limitazione è che lo sguardo
che usa un oggetto anonimo può solo invocare membri che sono ereditati da un supertipo.
È impossibile invocare tutti i membri definiti solo nella classe anonima.
Successivamente può essere istanziato solo al punto di dichiarazione.
Destra.
Infine, solo la classe non può essere utilizzata in quell'istanza o in qualsiasi altro luogo.
È richiesto un nome di classe.
Quindi questo è tutto.
Una classe anonima viene in genere utilizzata per implementare oggetti funzione.
Grazie.