KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > polyglot > util > Enum


1 package polyglot.util;
2
3 import java.io.Serializable JavaDoc;
4 import java.io.ObjectInputStream JavaDoc;
5 import java.io.ObjectOutputStream JavaDoc;
6 import java.io.IOException JavaDoc;
7 import java.util.*;
8
9 /** An enumerated type. Enums are interned and can be compared with ==. */
10 public class Enum implements Serializable JavaDoc
11 {
12     /** The name of the enum. Used for debugging and interning. */
13     private String JavaDoc name;
14
15     /** The intern cache. */
16     private static Map cache = new HashMap();
17
18     protected Enum(String JavaDoc name) {
19     this.name = name;
20
21         // intern the enum and make sure this one is unique
22
if (intern() != this) {
23             throw new InternalCompilerError("Duplicate enum \"" + name + "\"");
24         }
25     }
26
27     /** For serialization. */
28     private Enum() { }
29
30     public int hashCode() {
31         return name.hashCode();
32     }
33
34     public boolean equals(Object JavaDoc o) {
35     return this == o;
36     }
37
38     public String JavaDoc toString() {
39     return name;
40     }
41
42     private static class EnumKey {
43     Enum JavaDoc e;
44
45     EnumKey(Enum JavaDoc e) {
46         this.e = e;
47     }
48
49     public boolean equals(Object JavaDoc o) {
50         return o instanceof EnumKey
51             && e.name.equals(((EnumKey) o).e.name)
52             && e.getClass() == ((EnumKey) o).e.getClass();
53     }
54
55     public int hashCode() {
56         return e.getClass().hashCode() ^ e.name.hashCode();
57     }
58
59         public String JavaDoc toString() {
60             return e.toString();
61         }
62     }
63
64     public Enum JavaDoc intern() {
65         EnumKey k = new EnumKey(this);
66
67     Enum JavaDoc e = (Enum JavaDoc) cache.get(k);
68
69     if (e == null) {
70         cache.put(k, this);
71         return this;
72     }
73
74     return e;
75     }
76 }
77
Popular Tags