1 /*
2 * Licensed under the GPL License. You may not use this file except in compliance with the License.
3 * You may obtain a copy of the License at
4 *
5 * https://www.gnu.org/licenses/old-licenses/gpl-2.0.html
6 *
7 * THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
8 * WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
9 * PURPOSE.
10 */
11 package psiprobe.tools;
12
13 /**
14 * Wraps an object that may have overridden the {@link Object#equals(Object) equals()} and
15 * {@link Object#hashCode() hashCode()} methods so it reverts to the default behavior for
16 * {@link Object} instead.
17 *
18 * <p>
19 * This allows us to (1) use {@link java.util.Collection#contains(Object)} to filter out unique
20 * instances when calculating object sizes and (2) call {@link Object#hashCode() hashCode()} without
21 * fear of an exception or infinite loop.
22 * </p>
23 *
24 * @see Instruments
25 */
26 class ObjectWrapper {
27
28 /** The wrapped object. */
29 private final Object wrappedObject;
30
31 /**
32 * Instantiates a new object wrapper.
33 *
34 * @param obj the obj
35 */
36 public ObjectWrapper(Object obj) {
37 this.wrappedObject = obj;
38 }
39
40 @Override
41 public boolean equals(Object o1) {
42 if (wrappedObject == null) {
43 return o1 == null;
44 }
45 if (this.getClass() != o1.getClass()) {
46 return false;
47 }
48 ObjectWrapper ow = (ObjectWrapper) o1;
49 /*
50 * I know, this condition may seem strange, but if "equals" is left in, sizeOf() may run into an
51 * infinite loop on some objects
52 */
53 return ow.wrappedObject == wrappedObject; // || o.equals(ow.o);
54 }
55
56 @Override
57 public int hashCode() {
58 return System.identityHashCode(wrappedObject);
59 }
60
61 }