mercoledì 13 luglio 2011

Java segreto: Utilizzare un enum per costruire una macchina a stati

da Java Code Geek

Panoramica
Il enum in Java è più potente di molti altri linguaggi che può portare ad usi sorprendente. In questo articolo, ho delineare alcune delle caratteristiche individuali di enum in Java, e metterli insieme per formare una macchina a stati.



Enum per la classe Singleton e Utility
È possibile utilizzare un enum come Singleton o Utility in modo molto semplice.

1enum {Singleton
2 GRADO;
3}
4enum {Utility
5 ; / / nessun caso
6}

Enum per implementare un'interfaccia
È anche possibile implementare un'interfaccia in un enum.
01Interfaccia nome {
02 pubblico String name ();
03 pubblico int ordine ();
04}
05
06enum Pianeti implementa nome {
07 Mercurio, Venere, Terra, Marte, Giove, Saturno, Urano, Nettuno;
08 / / Nome () è implementato automagicamente.
09 pubblico int ordine () { ritorno ordinale () + 1 ;}
10}

Ogni istanza Enum un diverso sottoclasse
È possibile ignorare il comportamento di un'istanza. Questo effettivamente dare l'esempio, una diversa sotto-classe della enum con la propria implementazione.
01/ / Da http://download.oracle.com/javase/1 , 5.0/docs/guide/language/enums.html
02pubblico enum Operazione {
03 PLUS { doppio eval ( doppio x, doppio y) { ritorno x + y;}}
04 MENO { doppio eval ( doppio x, doppio y) { ritorno x - y;}}
05 TEMPI { doppio eval ( doppio x, doppio y) { ritorno x * y;}}
06 DIVIDE { doppio eval ( doppio x, doppio y) { ritorno x / y;}};
07
08 / / Do op aritmetica rappresentata da questa costante
09 astratto doppio eval ( doppio x, doppio y);
10}

L'utilizzo di un enum come una macchina a stati
Cosa si può fare con tutte queste tecniche è quello di creare una dichiarazione basata enum. In questo breve esempio, una macchina a stati parser elabora i dati XML da un ByteBuffer. Ogni stato ha il proprio metodo di processo e se non ci sono dati sufficienti a disposizione, la macchina dello stato può tornare a recuperare altri dati. Ogni transizione tra stati è ben definito e il codice per tutti gli stati sono insieme in una enum .



01interfaccia Context {
02 ByteBuffer tampone ();
03 Stato di stato ();
04 vuoto dello Stato (Stato stato);
05}
06Interfaccia Stato {
07 / **
08 * @ Return true per continuare l'elaborazione, false per saperne di più dati.
09 * /
10 boolean processo (contesto contesto);
11}
12enum Stati implementa Stato {
13 XML {
14 pubblico boolean processo (contesto Context) {
15 se (. context.buffer () rimanente () < 16 ), di ritorno falso ;
16 / / Leggere l'intestazione
17 se (headerComplete)
18 context.state (States.ROOT);
19 ritorno vero ;
20 }
21 }, {ROOT
22 pubblico boolean processo (contesto Context) {
23 se (. context.buffer () rimanente () < 8 ) ritorno falso ;
24 / / Leggere tag radice
25 se (rootComplete)
26 context.state (States.IN_ROOT);
27 ritorno vero ;
28 }
29 }
30}
31
32pubblica vuoto di processo (contesto Context) {
33 socket.read (context.buffer ());
34 mentre (context.state () processo (contesto).);
35}

Usando questo approccio è possibile scrivere un parser XML in grado di elaborare i pacchetti in sub 10 micro-secondi. Si è così efficiente come sarebbe necessario per la maggior parte dei casi.

Corso Java - Corsi Java - Corsi programmazione Java

Corso programmazione Android - Certificazione Android

Nessun commento:

Posta un commento

Nota. Solo i membri di questo blog possono postare un commento.