1 /* 2 * Copyright (C) 2012 The Guava Authors 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.google.common.testing; 18 19 import com.google.common.base.CharMatcher; 20 import com.google.common.base.Charsets; 21 import com.google.common.base.Equivalence; 22 import com.google.common.base.Joiner; 23 import com.google.common.base.Optional; 24 import com.google.common.base.Predicate; 25 import com.google.common.base.Splitter; 26 import com.google.common.base.Stopwatch; 27 import com.google.common.base.Ticker; 28 import com.google.common.collect.BiMap; 29 import com.google.common.collect.ClassToInstanceMap; 30 import com.google.common.collect.ImmutableBiMap; 31 import com.google.common.collect.ImmutableClassToInstanceMap; 32 import com.google.common.collect.ImmutableCollection; 33 import com.google.common.collect.ImmutableList; 34 import com.google.common.collect.ImmutableListMultimap; 35 import com.google.common.collect.ImmutableMap; 36 import com.google.common.collect.ImmutableMultimap; 37 import com.google.common.collect.ImmutableMultiset; 38 import com.google.common.collect.ImmutableSet; 39 import com.google.common.collect.ImmutableSetMultimap; 40 import com.google.common.collect.ImmutableSortedMap; 41 import com.google.common.collect.ImmutableSortedSet; 42 import com.google.common.collect.ImmutableTable; 43 import com.google.common.collect.ListMultimap; 44 import com.google.common.collect.MapConstraint; 45 import com.google.common.collect.MapDifference; 46 import com.google.common.collect.Multimap; 47 import com.google.common.collect.Multiset; 48 import com.google.common.collect.PeekingIterator; 49 import com.google.common.collect.Range; 50 import com.google.common.collect.RowSortedTable; 51 import com.google.common.collect.SetMultimap; 52 import com.google.common.collect.SortedMapDifference; 53 import com.google.common.collect.SortedMultiset; 54 import com.google.common.collect.SortedSetMultimap; 55 import com.google.common.collect.Table; 56 import com.google.common.io.ByteSink; 57 import com.google.common.io.ByteSource; 58 import com.google.common.io.CharSink; 59 import com.google.common.io.CharSource; 60 import com.google.common.primitives.UnsignedInteger; 61 import com.google.common.primitives.UnsignedLong; 62 import com.google.common.util.concurrent.AtomicDouble; 63 64 import junit.framework.TestCase; 65 66 import java.io.ByteArrayInputStream; 67 import java.io.ByteArrayOutputStream; 68 import java.io.File; 69 import java.io.IOException; 70 import java.io.InputStream; 71 import java.io.OutputStream; 72 import java.io.PrintStream; 73 import java.io.PrintWriter; 74 import java.io.Reader; 75 import java.io.StringReader; 76 import java.io.StringWriter; 77 import java.io.Writer; 78 import java.lang.reflect.AnnotatedElement; 79 import java.lang.reflect.GenericDeclaration; 80 import java.lang.reflect.Type; 81 import java.math.BigDecimal; 82 import java.math.BigInteger; 83 import java.nio.Buffer; 84 import java.nio.ByteBuffer; 85 import java.nio.CharBuffer; 86 import java.nio.DoubleBuffer; 87 import java.nio.FloatBuffer; 88 import java.nio.IntBuffer; 89 import java.nio.LongBuffer; 90 import java.nio.ShortBuffer; 91 import java.nio.charset.Charset; 92 import java.util.ArrayList; 93 import java.util.BitSet; 94 import java.util.Collection; 95 import java.util.Comparator; 96 import java.util.Currency; 97 import java.util.Deque; 98 import java.util.HashMap; 99 import java.util.Iterator; 100 import java.util.LinkedList; 101 import java.util.List; 102 import java.util.ListIterator; 103 import java.util.Locale; 104 import java.util.Map; 105 import java.util.NavigableMap; 106 import java.util.NavigableSet; 107 import java.util.PriorityQueue; 108 import java.util.Queue; 109 import java.util.Random; 110 import java.util.Set; 111 import java.util.SortedMap; 112 import java.util.SortedSet; 113 import java.util.TreeMap; 114 import java.util.TreeSet; 115 import java.util.concurrent.BlockingDeque; 116 import java.util.concurrent.BlockingQueue; 117 import java.util.concurrent.ConcurrentMap; 118 import java.util.concurrent.ConcurrentNavigableMap; 119 import java.util.concurrent.DelayQueue; 120 import java.util.concurrent.Executor; 121 import java.util.concurrent.PriorityBlockingQueue; 122 import java.util.concurrent.SynchronousQueue; 123 import java.util.concurrent.ThreadFactory; 124 import java.util.concurrent.TimeUnit; 125 import java.util.concurrent.atomic.AtomicBoolean; 126 import java.util.concurrent.atomic.AtomicInteger; 127 import java.util.concurrent.atomic.AtomicLong; 128 import java.util.concurrent.atomic.AtomicReference; 129 import java.util.regex.MatchResult; 130 import java.util.regex.Pattern; 131 132 /** 133 * Unit test for {@link ArbitraryInstances}. 134 * 135 * @author Ben Yu 136 */ 137 public class ArbitraryInstancesTest extends TestCase { 138 139 public void testGet_primitives() { 140 assertNull(ArbitraryInstances.get(void.class)); 141 assertNull(ArbitraryInstances.get(Void.class)); 142 assertEquals(Boolean.FALSE, ArbitraryInstances.get(boolean.class)); 143 assertEquals(Boolean.FALSE, ArbitraryInstances.get(Boolean.class)); 144 assertEquals(Character.valueOf('\0'), ArbitraryInstances.get(char.class)); 145 assertEquals(Character.valueOf('\0'), ArbitraryInstances.get(Character.class)); 146 assertEquals(Byte.valueOf((byte) 0), ArbitraryInstances.get(byte.class)); 147 assertEquals(Byte.valueOf((byte) 0), ArbitraryInstances.get(Byte.class)); 148 assertEquals(Short.valueOf((short) 0), ArbitraryInstances.get(short.class)); 149 assertEquals(Short.valueOf((short) 0), ArbitraryInstances.get(Short.class)); 150 assertEquals(Integer.valueOf(0), ArbitraryInstances.get(int.class)); 151 assertEquals(Integer.valueOf(0), ArbitraryInstances.get(Integer.class)); 152 assertEquals(Long.valueOf(0), ArbitraryInstances.get(long.class)); 153 assertEquals(Long.valueOf(0), ArbitraryInstances.get(Long.class)); 154 assertEquals(Float.valueOf(0), ArbitraryInstances.get(float.class)); 155 assertEquals(Float.valueOf(0), ArbitraryInstances.get(Float.class)); 156 assertEquals(Double.valueOf(0), ArbitraryInstances.get(double.class)); 157 assertEquals(Double.valueOf(0), ArbitraryInstances.get(Double.class)); 158 assertEquals(UnsignedInteger.ZERO, ArbitraryInstances.get(UnsignedInteger.class)); 159 assertEquals(UnsignedLong.ZERO, ArbitraryInstances.get(UnsignedLong.class)); 160 assertEquals(0, ArbitraryInstances.get(BigDecimal.class).intValue()); 161 assertEquals(0, ArbitraryInstances.get(BigInteger.class).intValue()); 162 assertEquals("", ArbitraryInstances.get(String.class)); 163 assertEquals("", ArbitraryInstances.get(CharSequence.class)); 164 assertEquals(TimeUnit.SECONDS, ArbitraryInstances.get(TimeUnit.class)); 165 assertNotNull(ArbitraryInstances.get(Object.class)); 166 assertEquals(0, ArbitraryInstances.get(Number.class)); 167 assertEquals(Charsets.UTF_8, ArbitraryInstances.get(Charset.class)); 168 } 169 170 public void testGet_collections() { 171 assertEquals(ImmutableSet.of().iterator(), ArbitraryInstances.get(Iterator.class)); 172 assertFalse(ArbitraryInstances.get(PeekingIterator.class).hasNext()); 173 assertFalse(ArbitraryInstances.get(ListIterator.class).hasNext()); 174 assertEquals(ImmutableSet.of(), ArbitraryInstances.get(Iterable.class)); 175 assertEquals(ImmutableSet.of(), ArbitraryInstances.get(Set.class)); 176 assertEquals(ImmutableSet.of(), ArbitraryInstances.get(ImmutableSet.class)); 177 assertEquals(ImmutableSortedSet.of(), ArbitraryInstances.get(SortedSet.class)); 178 assertEquals(ImmutableSortedSet.of(), ArbitraryInstances.get(ImmutableSortedSet.class)); 179 assertEquals(ImmutableList.of(), ArbitraryInstances.get(Collection.class)); 180 assertEquals(ImmutableList.of(), ArbitraryInstances.get(ImmutableCollection.class)); 181 assertEquals(ImmutableList.of(), ArbitraryInstances.get(List.class)); 182 assertEquals(ImmutableList.of(), ArbitraryInstances.get(ImmutableList.class)); 183 assertEquals(ImmutableMap.of(), ArbitraryInstances.get(Map.class)); 184 assertEquals(ImmutableMap.of(), ArbitraryInstances.get(ImmutableMap.class)); 185 assertEquals(ImmutableSortedMap.of(), ArbitraryInstances.get(SortedMap.class)); 186 assertEquals(ImmutableSortedMap.of(), ArbitraryInstances.get(ImmutableSortedMap.class)); 187 assertEquals(ImmutableMultiset.of(), ArbitraryInstances.get(Multiset.class)); 188 assertEquals(ImmutableMultiset.of(), ArbitraryInstances.get(ImmutableMultiset.class)); 189 assertTrue(ArbitraryInstances.get(SortedMultiset.class).isEmpty()); 190 assertEquals(ImmutableMultimap.of(), ArbitraryInstances.get(Multimap.class)); 191 assertEquals(ImmutableMultimap.of(), ArbitraryInstances.get(ImmutableMultimap.class)); 192 assertTrue(ArbitraryInstances.get(SortedSetMultimap.class).isEmpty()); 193 assertEquals(ImmutableTable.of(), ArbitraryInstances.get(Table.class)); 194 assertEquals(ImmutableTable.of(), ArbitraryInstances.get(ImmutableTable.class)); 195 assertTrue(ArbitraryInstances.get(RowSortedTable.class).isEmpty()); 196 assertEquals(ImmutableBiMap.of(), ArbitraryInstances.get(BiMap.class)); 197 assertEquals(ImmutableBiMap.of(), ArbitraryInstances.get(ImmutableBiMap.class)); 198 assertTrue(ArbitraryInstances.get(ImmutableClassToInstanceMap.class).isEmpty()); 199 assertTrue(ArbitraryInstances.get(ClassToInstanceMap.class).isEmpty()); 200 assertTrue(ArbitraryInstances.get(ListMultimap.class).isEmpty()); 201 assertTrue(ArbitraryInstances.get(ImmutableListMultimap.class).isEmpty()); 202 assertTrue(ArbitraryInstances.get(SetMultimap.class).isEmpty()); 203 assertTrue(ArbitraryInstances.get(ImmutableSetMultimap.class).isEmpty()); 204 assertTrue(ArbitraryInstances.get(MapDifference.class).areEqual()); 205 assertTrue(ArbitraryInstances.get(SortedMapDifference.class).areEqual()); 206 assertEquals(Range.all(), ArbitraryInstances.get(Range.class)); 207 assertTrue(ArbitraryInstances.get(NavigableSet.class).isEmpty()); 208 assertTrue(ArbitraryInstances.get(NavigableMap.class).isEmpty()); 209 assertTrue(ArbitraryInstances.get(LinkedList.class).isEmpty()); 210 assertTrue(ArbitraryInstances.get(Deque.class).isEmpty()); 211 assertTrue(ArbitraryInstances.get(Queue.class).isEmpty()); 212 assertTrue(ArbitraryInstances.get(PriorityQueue.class).isEmpty()); 213 assertTrue(ArbitraryInstances.get(BitSet.class).isEmpty()); 214 assertTrue(ArbitraryInstances.get(TreeSet.class).isEmpty()); 215 assertTrue(ArbitraryInstances.get(TreeMap.class).isEmpty()); 216 assertFreshInstanceReturned( 217 LinkedList.class, Deque.class, Queue.class, PriorityQueue.class, BitSet.class, 218 TreeSet.class, TreeMap.class); 219 } 220 221 public void testGet_misc() { 222 assertNotNull(ArbitraryInstances.get(CharMatcher.class)); 223 assertNotNull(ArbitraryInstances.get(Currency.class).getCurrencyCode()); 224 assertNotNull(ArbitraryInstances.get(Locale.class)); 225 ArbitraryInstances.get(Joiner.class).join(ImmutableList.of("a")); 226 ArbitraryInstances.get(Splitter.class).split("a,b"); 227 assertFalse(ArbitraryInstances.get(Optional.class).isPresent()); 228 ArbitraryInstances.get(Stopwatch.class).start(); 229 assertNotNull(ArbitraryInstances.get(Ticker.class)); 230 assertNotNull(ArbitraryInstances.get(MapConstraint.class)); 231 assertFreshInstanceReturned(Random.class); 232 assertEquals(ArbitraryInstances.get(Random.class).nextInt(), 233 ArbitraryInstances.get(Random.class).nextInt()); 234 } 235 236 public void testGet_concurrent() { 237 assertTrue(ArbitraryInstances.get(BlockingDeque.class).isEmpty()); 238 assertTrue(ArbitraryInstances.get(BlockingQueue.class).isEmpty()); 239 assertTrue(ArbitraryInstances.get(DelayQueue.class).isEmpty()); 240 assertTrue(ArbitraryInstances.get(SynchronousQueue.class).isEmpty()); 241 assertTrue(ArbitraryInstances.get(PriorityBlockingQueue.class).isEmpty()); 242 assertTrue(ArbitraryInstances.get(ConcurrentMap.class).isEmpty()); 243 assertTrue(ArbitraryInstances.get(ConcurrentNavigableMap.class).isEmpty()); 244 ArbitraryInstances.get(Executor.class).execute(ArbitraryInstances.get(Runnable.class)); 245 assertNotNull(ArbitraryInstances.get(ThreadFactory.class)); 246 assertFreshInstanceReturned( 247 BlockingQueue.class, BlockingDeque.class, PriorityBlockingQueue.class, 248 DelayQueue.class, SynchronousQueue.class, 249 ConcurrentMap.class, ConcurrentNavigableMap.class, 250 AtomicReference.class, AtomicBoolean.class, 251 AtomicInteger.class, AtomicLong.class, AtomicDouble.class); 252 } 253 254 @SuppressWarnings("unchecked") // functor classes have no type parameters 255 public void testGet_functors() { 256 assertEquals(0, ArbitraryInstances.get(Comparator.class).compare("abc", 123)); 257 assertTrue(ArbitraryInstances.get(Predicate.class).apply("abc")); 258 assertTrue(ArbitraryInstances.get(Equivalence.class).equivalent(1, 1)); 259 assertFalse(ArbitraryInstances.get(Equivalence.class).equivalent(1, 2)); 260 } 261 262 public void testGet_comparable() { 263 @SuppressWarnings("unchecked") // The null value can compare with any Object 264 Comparable<Object> comparable = ArbitraryInstances.get(Comparable.class); 265 assertEquals(0, comparable.compareTo(comparable)); 266 assertTrue(comparable.compareTo("") > 0); 267 try { 268 comparable.compareTo(null); 269 fail(); 270 } catch (NullPointerException expected) {} 271 } 272 273 public void testGet_array() { 274 assertEquals(0, ArbitraryInstances.get(int[].class).length); 275 assertEquals(0, ArbitraryInstances.get(Object[].class).length); 276 assertEquals(0, ArbitraryInstances.get(String[].class).length); 277 } 278 279 public void testGet_enum() { 280 assertNull(ArbitraryInstances.get(EmptyEnum.class)); 281 assertEquals(Direction.UP, ArbitraryInstances.get(Direction.class)); 282 } 283 284 public void testGet_interface() { 285 assertNull(ArbitraryInstances.get(SomeInterface.class)); 286 } 287 288 public void testGet_runnable() { 289 ArbitraryInstances.get(Runnable.class).run(); 290 } 291 292 public void testGet_class() { 293 assertSame(SomeAbstractClass.INSTANCE, ArbitraryInstances.get(SomeAbstractClass.class)); 294 assertSame(WithPrivateConstructor.INSTANCE, 295 ArbitraryInstances.get(WithPrivateConstructor.class)); 296 assertNull(ArbitraryInstances.get(NoDefaultConstructor.class)); 297 assertSame(WithExceptionalConstructor.INSTANCE, 298 ArbitraryInstances.get(WithExceptionalConstructor.class)); 299 assertNull(ArbitraryInstances.get(NonPublicClass.class)); 300 } 301 302 public void testGet_mutable() { 303 assertEquals(0, ArbitraryInstances.get(ArrayList.class).size()); 304 assertEquals(0, ArbitraryInstances.get(HashMap.class).size()); 305 assertEquals("", ArbitraryInstances.get(Appendable.class).toString()); 306 assertEquals("", ArbitraryInstances.get(StringBuilder.class).toString()); 307 assertEquals("", ArbitraryInstances.get(StringBuffer.class).toString()); 308 assertFreshInstanceReturned( 309 ArrayList.class, HashMap.class, 310 Appendable.class, StringBuilder.class, StringBuffer.class, 311 Throwable.class, Exception.class); 312 } 313 314 public void testGet_io() throws IOException { 315 assertEquals(-1, ArbitraryInstances.get(InputStream.class).read()); 316 assertEquals(-1, ArbitraryInstances.get(ByteArrayInputStream.class).read()); 317 assertEquals(-1, ArbitraryInstances.get(Readable.class).read(CharBuffer.allocate(1))); 318 assertEquals(-1, ArbitraryInstances.get(Reader.class).read()); 319 assertEquals(-1, ArbitraryInstances.get(StringReader.class).read()); 320 assertEquals(0, ArbitraryInstances.get(Buffer.class).capacity()); 321 assertEquals(0, ArbitraryInstances.get(CharBuffer.class).capacity()); 322 assertEquals(0, ArbitraryInstances.get(ByteBuffer.class).capacity()); 323 assertEquals(0, ArbitraryInstances.get(ShortBuffer.class).capacity()); 324 assertEquals(0, ArbitraryInstances.get(IntBuffer.class).capacity()); 325 assertEquals(0, ArbitraryInstances.get(LongBuffer.class).capacity()); 326 assertEquals(0, ArbitraryInstances.get(FloatBuffer.class).capacity()); 327 assertEquals(0, ArbitraryInstances.get(DoubleBuffer.class).capacity()); 328 ArbitraryInstances.get(PrintStream.class).println("test"); 329 ArbitraryInstances.get(PrintWriter.class).println("test"); 330 assertNotNull(ArbitraryInstances.get(File.class)); 331 assertFreshInstanceReturned( 332 ByteArrayOutputStream.class, OutputStream.class, 333 Writer.class, StringWriter.class, 334 PrintStream.class, PrintWriter.class); 335 assertEquals(ByteSource.empty(), ArbitraryInstances.get(ByteSource.class)); 336 assertEquals(CharSource.empty(), ArbitraryInstances.get(CharSource.class)); 337 assertNotNull(ArbitraryInstances.get(ByteSink.class)); 338 assertNotNull(ArbitraryInstances.get(CharSink.class)); 339 } 340 341 public void testGet_reflect() { 342 assertNotNull(ArbitraryInstances.get(Type.class)); 343 assertNotNull(ArbitraryInstances.get(AnnotatedElement.class)); 344 assertNotNull(ArbitraryInstances.get(GenericDeclaration.class)); 345 } 346 347 public void testGet_regex() { 348 assertEquals(Pattern.compile("").pattern(), 349 ArbitraryInstances.get(Pattern.class).pattern()); 350 assertEquals(0, ArbitraryInstances.get(MatchResult.class).groupCount()); 351 } 352 353 public void testGet_usePublicConstant() { 354 assertSame(WithPublicConstant.INSTANCE, 355 ArbitraryInstances.get(WithPublicConstant.class)); 356 } 357 358 public void testGet_useFirstPublicConstant() { 359 assertSame(WithPublicConstants.FIRST, 360 ArbitraryInstances.get(WithPublicConstants.class)); 361 } 362 363 public void testGet_nullConstantIgnored() { 364 assertSame(FirstConstantIsNull.SECOND, 365 ArbitraryInstances.get(FirstConstantIsNull.class)); 366 } 367 368 public void testGet_constantWithGenericsNotUsed() { 369 assertNull(ArbitraryInstances.get(WithGenericConstant.class)); 370 } 371 372 public void testGet_nullConstant() { 373 assertNull(ArbitraryInstances.get(WithNullConstant.class)); 374 } 375 376 public void testGet_constantTypeDoesNotMatch() { 377 assertNull(ArbitraryInstances.get(ParentClassHasConstant.class)); 378 } 379 380 public void testGet_nonPublicConstantNotUsed() { 381 assertNull(ArbitraryInstances.get(NonPublicConstantIgnored.class)); 382 } 383 384 public void testGet_nonStaticFieldNotUsed() { 385 assertNull(ArbitraryInstances.get(NonStaticFieldIgnored.class)); 386 } 387 388 public void testGet_constructorPreferredOverConstants() { 389 assertNotNull(ArbitraryInstances.get(WithPublicConstructorAndConstant.class)); 390 assertTrue(ArbitraryInstances.get(WithPublicConstructorAndConstant.class) 391 != ArbitraryInstances.get(WithPublicConstructorAndConstant.class)); 392 } 393 394 public void testGet_nonFinalFieldNotUsed() { 395 assertNull(ArbitraryInstances.get(NonFinalFieldIgnored.class)); 396 } 397 398 private static void assertFreshInstanceReturned(Class<?>... mutableClasses) { 399 for (Class<?> mutableClass : mutableClasses) { 400 Object instance = ArbitraryInstances.get(mutableClass); 401 assertNotNull("Expected to return non-null for: " + mutableClass, instance); 402 assertNotSame("Expected to return fresh instance for: " + mutableClass, 403 instance, ArbitraryInstances.get(mutableClass)); 404 } 405 } 406 407 private enum EmptyEnum {} 408 409 private enum Direction { 410 UP, DOWN 411 } 412 413 public interface SomeInterface {} 414 415 public static abstract class SomeAbstractClass { 416 public static final SomeAbstractClass INSTANCE = new SomeAbstractClass() {}; 417 public SomeAbstractClass() {} 418 } 419 420 static class NonPublicClass { 421 public NonPublicClass() {} 422 } 423 424 private static class WithPrivateConstructor { 425 public static final WithPrivateConstructor INSTANCE = new WithPrivateConstructor(); 426 } 427 428 public static class NoDefaultConstructor { 429 public NoDefaultConstructor(@SuppressWarnings("unused") int i) {} 430 } 431 432 public static class WithExceptionalConstructor { 433 public static final WithExceptionalConstructor INSTANCE = 434 new WithExceptionalConstructor("whatever"); 435 436 public WithExceptionalConstructor() { 437 throw new RuntimeException(); 438 } 439 private WithExceptionalConstructor(String unused) {} 440 } 441 442 private static class WithPublicConstant { 443 public static final WithPublicConstant INSTANCE = new WithPublicConstant(); 444 } 445 446 private static class ParentClassHasConstant 447 extends WithPublicConstant {} 448 449 public static class WithGenericConstant<T> { 450 public static final WithGenericConstant<String> STRING_CONSTANT = 451 new WithGenericConstant<String>(); 452 453 private WithGenericConstant() {} 454 } 455 456 public static class WithNullConstant { 457 public static final WithNullConstant NULL = null; 458 459 private WithNullConstant() {} 460 } 461 462 public static class WithPublicConstructorAndConstant { 463 public static final WithPublicConstructorAndConstant INSTANCE = 464 new WithPublicConstructorAndConstant(); 465 466 public WithPublicConstructorAndConstant() {} 467 } 468 469 private static class WithPublicConstants { 470 public static final WithPublicConstants FIRST = new WithPublicConstants(); 471 472 // To test that we pick the first constant alphabetically 473 @SuppressWarnings("unused") 474 public static final WithPublicConstants SECOND = new WithPublicConstants(); 475 } 476 477 private static class FirstConstantIsNull { 478 // To test that null constant is ignored 479 @SuppressWarnings("unused") 480 public static final FirstConstantIsNull FIRST = null; 481 public static final FirstConstantIsNull SECOND = new FirstConstantIsNull(); 482 } 483 484 public static class NonFinalFieldIgnored { 485 public static NonFinalFieldIgnored instance = 486 new NonFinalFieldIgnored(); 487 488 private NonFinalFieldIgnored() {} 489 } 490 491 public static class NonPublicConstantIgnored { 492 static final NonPublicConstantIgnored INSTANCE = 493 new NonPublicConstantIgnored(); 494 495 private NonPublicConstantIgnored() {} 496 } 497 498 public static class NonStaticFieldIgnored { 499 // This should cause infinite recursion. But it shouldn't be used anyway. 500 public final NonStaticFieldIgnored instance = 501 new NonStaticFieldIgnored(); 502 503 private NonStaticFieldIgnored() {} 504 } 505 } 506