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.
Enum per implementare un'interfaccia
È anche possibile implementare un'interfaccia in un enum.
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.
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 .
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.
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.
1 | enum {Singleton |
2 | GRADO; |
3 | } |
4 | enum {Utility |
5 | ; / / nessun caso |
6 | } |
Enum per implementare un'interfaccia
È anche possibile implementare un'interfaccia in un enum.
01 | Interfaccia nome { |
02 | pubblico String name (); |
03 | pubblico int ordine (); |
04 | } |
05 |
06 | enum 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 |
02 | pubblico 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 .
01 | interfaccia Context { |
02 | ByteBuffer tampone (); |
03 | Stato di stato (); |
04 | vuoto dello Stato (Stato stato); |
05 | } |
06 | Interfaccia Stato { |
07 | / ** |
08 | * @ Return true per continuare l'elaborazione, false per saperne di più dati. |
09 | * / |
10 | boolean processo (contesto contesto); |
11 | } |
12 | enum 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 |
32 | pubblica 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.
Nessun commento:
Posta un commento
Nota. Solo i membri di questo blog possono postare un commento.