1:
31: package ;
32:
33: import ;
34: import ;
35:
36:
41: public class LazyNameMap implements Cloneable
42: {
43: public static class NameCarrier
44: {
45: private int value;
46: private int counter;
47:
48: public NameCarrier(final int value)
49: {
50: this.value = value;
51: this.counter = 1;
52: }
53:
54: public int getValue()
55: {
56: return value;
57: }
58:
59: public int getInstanceCount()
60: {
61: return counter;
62: }
63:
64: public void increase()
65: {
66: this.counter += 1;
67: }
68:
69: public void decrease()
70: {
71: this.counter -= 1;
72: }
73: }
74:
75: private HashMap map;
76: private ArrayList names;
77: private boolean clean;
78:
79: public LazyNameMap()
80: {
81: map = new HashMap();
82: names = new ArrayList();
83: clean = false;
84: }
85:
86: public boolean isClean()
87: {
88: return clean;
89: }
90:
91: public void setValue(final String key, final int value)
92: {
93: if (clean)
94: {
95: map = (HashMap) map.clone();
96: names = (ArrayList) names.clone();
97: clean = false;
98: }
99:
100: map.put(key, new NameCarrier(value));
101: }
102:
103: public NameCarrier get(final String key)
104: {
105: return (NameCarrier) map.get(key);
106: }
107:
108: public NameCarrier remove(final String key)
109: {
110: final NameCarrier nc = (NameCarrier) map.get(key);
111: if (nc == null)
112: {
113: return null;
114: }
115:
116: if (clean)
117: {
118: map = (HashMap) map.clone();
119: names = (ArrayList) names.clone();
120: clean = false;
121: }
122: return (NameCarrier) map.remove(key);
123: }
124:
125: public Object clone()
126: {
127: try
128: {
129: final LazyNameMap lm = (LazyNameMap) super.clone();
130: lm.clean = true;
131: clean = true;
132: return lm;
133: }
134: catch (CloneNotSupportedException e)
135: {
136: throw new IllegalStateException("Clone failed for some reason");
137: }
138: }
139: }