1 import otherpackage.OtherPackagePublicEnum; 2 3 import java.lang.reflect.*; 4 5 public class Main { 6 /** used by {@link #basisCall} */ 7 static private int basisTestValue = 12; 8 9 static public void main(String[] args) throws Exception { 10 try { 11 Class<?> enumClass = Enum.class; 12 Method enumValueOf = null; 13 for (Method m : enumClass.getDeclaredMethods()) { 14 if (m.getName().equals("valueOf")) { 15 enumValueOf = m; 16 break; 17 } 18 } 19 enumValueOf.invoke(null, String.class, "blah"); 20 throw new AssertionError(); 21 } catch (InvocationTargetException expected) { 22 IllegalArgumentException iae = (IllegalArgumentException) expected.getCause(); 23 if (!iae.getMessage().equals("class java.lang.String is not an enum type.")) { 24 throw new AssertionError(); 25 } 26 } 27 28 boolean timing = (args.length >= 1) && args[0].equals("--timing"); 29 run(timing); 30 } 31 32 static public void run(boolean timing) { 33 preTest(); 34 35 long time0 = System.nanoTime(); 36 int count1 = test1(500); 37 long time1 = System.nanoTime(); 38 int count2 = test2(500); 39 long time2 = System.nanoTime(); 40 int count3 = test3(500); 41 long time3 = System.nanoTime(); 42 int count4 = basis(500); 43 long time4 = System.nanoTime(); 44 45 System.out.println("basis: performed " + count4 + " iterations"); 46 System.out.println("test1: performed " + count1 + " iterations"); 47 System.out.println("test2: performed " + count2 + " iterations"); 48 System.out.println("test3: performed " + count3 + " iterations"); 49 50 double msec1 = (time1 - time0) / (double) count1 / 1000000; 51 double msec2 = (time2 - time1) / (double) count2 / 1000000; 52 double msec3 = (time3 - time2) / (double) count3 / 1000000; 53 double basisMsec = (time4 - time3) / (double) count4 / 1000000; 54 55 double avg = (msec1 + msec2 + msec3) / 3; 56 if (avg < (basisMsec * 10)) { 57 System.out.println("Timing is acceptable."); 58 } else { 59 System.out.println("Iterations are taking too long!"); 60 timing = true; 61 } 62 63 if (timing) { 64 System.out.printf("basis time: %.3g msec\n", basisMsec); 65 System.out.printf("test1: %.3g msec per iteration\n", msec1); 66 System.out.printf("test2: %.3g msec per iteration\n", msec2); 67 System.out.printf("test3: %.3g msec per iteration\n", msec3); 68 } 69 70 } 71 72 static public void preTest() { 73 /* 74 * This is meant to ensure that the basic enum functionality 75 * really is working. 76 */ 77 78 Class<SamePackagePublicEnum> c = SamePackagePublicEnum.class; 79 80 System.out.println(Enum.valueOf(c, "FOUR")); 81 System.out.println(Enum.valueOf(c, "ONE")); 82 System.out.println(Enum.valueOf(c, "FOURTEEN")); 83 System.out.println(Enum.valueOf(c, "NINE")); 84 System.out.println(Enum.valueOf(c, "FIVE")); 85 System.out.println(Enum.valueOf(c, "TWELVE")); 86 87 System.out.println(Enum.valueOf(c, "ZERO").getClass().getName()); 88 } 89 90 static final String[] BASIS_COMPARE_ARRAY = { 91 "ZERO", "ONE", "TWO", "THREE", "FOUR", "FIVE", "SIX", "SEVEN", "EIGHT", 92 "NINE", "TEN", "ELEVEN", "TWELVE", "THIRTEEN", "FOURTEEN", "FIFTEEN", 93 "SIXTEEN", "SEVENTEEN", "EIGHTEEN", "NINETEEN" 94 }; 95 96 static public int basis(int iters) { 97 for (int i = iters; i > 0; i--) { 98 basisValueOf("ZERO"); 99 basisValueOf("ONE"); 100 basisValueOf("TWO"); 101 basisValueOf("THREE"); 102 basisValueOf("FOUR"); 103 basisValueOf("FIVE"); 104 basisValueOf("SIX"); 105 basisValueOf("SEVEN"); 106 basisValueOf("EIGHT"); 107 basisValueOf("NINE"); 108 basisValueOf("TEN"); 109 basisValueOf("ELEVEN"); 110 basisValueOf("TWELVE"); 111 basisValueOf("THIRTEEN"); 112 basisValueOf("FOURTEEN"); 113 basisValueOf("FIFTEEN"); 114 basisValueOf("SIXTEEN"); 115 basisValueOf("SEVENTEEN"); 116 basisValueOf("EIGHTEEN"); 117 basisValueOf("NINETEEN"); 118 } 119 120 return iters * 20; 121 } 122 123 static String basisValueOf(String key) { 124 for (String s : BASIS_COMPARE_ARRAY) { 125 if (s.equals(key)) { 126 return s; 127 } 128 } 129 throw new IllegalArgumentException(); 130 } 131 132 static public int test1(int iters) { 133 Class<SamePackagePublicEnum> c = SamePackagePublicEnum.class; 134 for (int i = iters; i > 0; i--) { 135 Enum.valueOf(c, "ZERO"); 136 Enum.valueOf(c, "ONE"); 137 Enum.valueOf(c, "TWO"); 138 Enum.valueOf(c, "THREE"); 139 Enum.valueOf(c, "FOUR"); 140 Enum.valueOf(c, "FIVE"); 141 Enum.valueOf(c, "SIX"); 142 Enum.valueOf(c, "SEVEN"); 143 Enum.valueOf(c, "EIGHT"); 144 Enum.valueOf(c, "NINE"); 145 Enum.valueOf(c, "TEN"); 146 Enum.valueOf(c, "ELEVEN"); 147 Enum.valueOf(c, "TWELVE"); 148 Enum.valueOf(c, "THIRTEEN"); 149 Enum.valueOf(c, "FOURTEEN"); 150 Enum.valueOf(c, "FIFTEEN"); 151 Enum.valueOf(c, "SIXTEEN"); 152 Enum.valueOf(c, "SEVENTEEN"); 153 Enum.valueOf(c, "EIGHTEEN"); 154 Enum.valueOf(c, "NINETEEN"); 155 } 156 157 return iters * 20; 158 } 159 160 static public int test2(int iters) { 161 Class<SamePackagePrivateEnum> c = SamePackagePrivateEnum.class; 162 for (int i = iters; i > 0; i--) { 163 Enum.valueOf(c, "ZERO"); 164 Enum.valueOf(c, "ONE"); 165 Enum.valueOf(c, "TWO"); 166 Enum.valueOf(c, "THREE"); 167 Enum.valueOf(c, "FOUR"); 168 Enum.valueOf(c, "FIVE"); 169 Enum.valueOf(c, "SIX"); 170 Enum.valueOf(c, "SEVEN"); 171 Enum.valueOf(c, "EIGHT"); 172 Enum.valueOf(c, "NINE"); 173 Enum.valueOf(c, "TEN"); 174 Enum.valueOf(c, "ELEVEN"); 175 Enum.valueOf(c, "TWELVE"); 176 Enum.valueOf(c, "THIRTEEN"); 177 Enum.valueOf(c, "FOURTEEN"); 178 Enum.valueOf(c, "FIFTEEN"); 179 Enum.valueOf(c, "SIXTEEN"); 180 Enum.valueOf(c, "SEVENTEEN"); 181 Enum.valueOf(c, "EIGHTEEN"); 182 Enum.valueOf(c, "NINETEEN"); 183 } 184 185 return iters * 20; 186 } 187 188 static public int test3(int iters) { 189 Class<OtherPackagePublicEnum> c = OtherPackagePublicEnum.class; 190 for (int i = iters; i > 0; i--) { 191 Enum.valueOf(c, "ZERO"); 192 Enum.valueOf(c, "ONE"); 193 Enum.valueOf(c, "TWO"); 194 Enum.valueOf(c, "THREE"); 195 Enum.valueOf(c, "FOUR"); 196 Enum.valueOf(c, "FIVE"); 197 Enum.valueOf(c, "SIX"); 198 Enum.valueOf(c, "SEVEN"); 199 Enum.valueOf(c, "EIGHT"); 200 Enum.valueOf(c, "NINE"); 201 Enum.valueOf(c, "TEN"); 202 Enum.valueOf(c, "ELEVEN"); 203 Enum.valueOf(c, "TWELVE"); 204 Enum.valueOf(c, "THIRTEEN"); 205 Enum.valueOf(c, "FOURTEEN"); 206 Enum.valueOf(c, "FIFTEEN"); 207 Enum.valueOf(c, "SIXTEEN"); 208 Enum.valueOf(c, "SEVENTEEN"); 209 Enum.valueOf(c, "EIGHTEEN"); 210 Enum.valueOf(c, "NINETEEN"); 211 } 212 213 return iters * 20; 214 } 215 } 216