View Javadoc

1   /* Copyright (c) 2008 Sascha Kohlmann
2    *
3    * This program is free software: you can redistribute it and/or modify
4    * it under the terms of the GNU Affero General Public License as published by
5    * the Free Software Foundation, either version 3 of the License, or
6    * (at your option) any later version.
7    *
8    * This program is distributed in the hope that it will be useful,
9    * but WITHOUT ANY WARRANTY; without even the implied warranty of
10   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11   * GNU Affero General Public License for more details.
12   *
13   * You should have received a copy of the GNU Affero General Public License
14   * along with this program.  If not, see <http://www.gnu.org/licenses/>.
15   */
16  package net.sf.eos.util;
17  
18  import java.util.Arrays;
19  
20  import net.sf.eos.Nullable;
21  
22  /**
23   * Utility class to support {@link Object#equals(Object)}
24   * and {@link Object#hashCode()} method implementation.
25   * @author Sascha Kohlmann
26   * @since 0.1.0
27   * @version 1.0.0
28   */
29  public final class EqualsAndHashUtil {
30  
31      /** Magic hash multi value. */
32      private static final int HASH_MULTI = 37;
33  
34      /** Magic hash shift value. */
35      private static final int HASH_SHIFT = 32;
36  
37      /** Only {@code static} methods available. */
38      private EqualsAndHashUtil() {
39          super();
40      }
41  
42      /**
43       * {@code boolean} equality check.
44       * @param own the first {@code boolean}
45       * @param other the second <{@code boolean}
46       * @return {@code true} if the {@code boolean}s are equal,
47       *         <{@code false} otherwise
48       */
49      public static boolean isEqual(final boolean own, final boolean other) {
50          return own == other;
51      }
52  
53      /**
54       * {@code char} equality check.
55       * @param own the first {@code char}
56       * @param other the second {@code char}
57       * @return {@code true} if the {@code char}s are equal,
58       *         {@code false} otherwise
59       */
60      public static boolean isEqual(final char own, final char other) {
61          return own == other;
62      }
63  
64      /**
65       * {@code byte} equality check.
66       * @param own the first {@code byte}
67       * @param other the second {@code byte}
68       * @return {@code true} if the {@code byte}s are equal,
69       *         {@code false} otherwise
70       */
71      public static boolean isEqual(final byte own, final byte other) {
72          return own == other;
73      }
74  
75      /**
76       * {@code short} equality check.
77       * @param own the first {@code short}
78       * @param other the second {@code short}
79       * @return {@code true} if the {@code short}s are equal,
80       *         {@code false} otherwise
81       */
82      public static boolean isEqual(final short own, final short other) {
83          return own == other;
84      }
85  
86      /**
87       * {@code int} equality check.
88       * @param own the first {@code int}
89       * @param other the second {@code int}
90       * @return {@code true} if the {@code int}s are equal,
91       *         {@code false} otherwise
92       */
93      public static boolean isEqual(final int own, final int other) {
94          return own == other;
95      }
96  
97      /**
98       * {@code long} equality check.
99       * @param own the first {@code long}
100      * @param other the second {@code long}
101      * @return {@code true} if the {@code long}s are equal,
102      *         {@code false} otherwise
103      */
104     public static boolean isEqual(final long own, final long other) {
105         return own == other;
106     }
107 
108     /**
109      * {@code float} equality check.
110      * @param own the first {@code float}
111      * @param other the second {@code float}
112      * @return {@code true} if the {@code float}s are equal,
113      *         {@code false} otherwise
114      */
115     public static boolean isEqual(final float own, final float other) {
116         return Float.floatToIntBits(own) == Float.floatToIntBits(other);
117     }
118 
119     /**
120      * {@code double} equality check.
121      * @param own the first {@code double}
122      * @param other the second {@code double}
123      * @return {@code true} if the {@code double}s are equal,
124      *         {@code false} otherwise
125      */
126     public static boolean isEqual(final double own, final double other) {
127         return Double.doubleToLongBits(own) == Double.doubleToLongBits(other);
128     }
129 
130     /**
131      * {@code Object} equality check.
132      * @param own the first {@code Object}
133      * @param other the second {@code Object}
134      * @return {@code true} if the {@code Object}s are equal,
135      *         {@code false} otherwise
136      */
137     public static boolean isEqual(@Nullable final Object own,
138                                   @Nullable final Object other) {
139         return own == null ? other == null : own.equals(other);
140     }
141 
142     /**
143      * {@code boolean} array equality check.
144      * @param own the first array of {@code boolean}s
145      * @param other the second array of {@code boolean}s
146      * @return {@code true} if the two {@code boolean} arrays are
147      *         equal, {@code false} otherwise
148      */
149     public static boolean isEqual(@Nullable final boolean[] own,
150                                   @Nullable final boolean[] other) {
151         return Arrays.equals(own, other);
152     }
153 
154     /**
155      * {@code char} array equality check.
156      * @param own the first array of {@code char}s
157      * @param other the second array of {@code char}s
158      * @return {@code true} if the two {@code char} arrays are
159      *         equal, {@code false} otherwise
160      */
161     public static boolean isEqual(@Nullable final char[] own,
162                                   @Nullable final char[] other) {
163         return Arrays.equals(own, other);
164     }
165 
166     /**
167      * {@code byte} array equality check.
168      * @param own the first array of {@code byte}s
169      * @param other the second array of {@code byte}s
170      * @return {@code true} if the two {@code byte} arrays are
171      *         equal, {@code false} otherwise
172       */
173     public static boolean isEqual(@Nullable final byte[] own,
174                                   @Nullable final byte[] other) {
175         return Arrays.equals(own, other);
176     }
177 
178     /**
179      * {@code short} array equality check.
180      * @param own the first array of {@code short}s
181      * @param other the second array of {@code short}s
182      * @return {@code true} if the two {@code short} arrays are
183      *         equal, {@code false} otherwise
184      */
185     public static boolean isEqual(@Nullable final short[] own,
186                                   @Nullable final short[] other) {
187         return Arrays.equals(own, other);
188     }
189 
190     /**
191      * {@code int} array equality check.
192      * @param own the first array of {@code int}s
193      * @param other the second array of {@code int}s
194      * @return {@code true} if the two {@code int} arrays are
195      *         equal, {@code false} otherwise
196     */
197     public static boolean isEqual(@Nullable final int[] own,
198                                   @Nullable final int[] other) {
199         return Arrays.equals(own, other);
200     }
201 
202     /**
203      * {@code long} array equality check.
204      * @param own the first array of {@code long}s
205      * @param other the second array of {@code long}s
206      * @return {@code true} if the two {@code long} arrays are
207      *         equal, {@code false} otherwise
208      */
209     public static boolean isEqual(@Nullable final long[] own,
210                                   @Nullable final long[] other) {
211         return Arrays.equals(own, other);
212     }
213 
214     /**
215      * {@code float} array equality check.
216      * @param own the first array of {@code float}s
217      * @param other the second array of {@code float}s
218      * @return {@code true} if the two {@code float} arrays are
219      *         equal, {@code false} otherwise
220      */
221     public static boolean isEqual(@Nullable final float[] own,
222                                   @Nullable final float[] other) {
223         return Arrays.equals(own, other);
224     }
225 
226     /**
227      * {@code double} array equality check.
228      * @param own the first array of {@code double}s
229      * @param other the second array of {@code double}s
230      * @return {@code true} if the two {@code double} arrays are
231      *         equal, {@code false} otherwise
232      */
233     public static boolean isEqual(@Nullable final double[] own,
234                                   @Nullable final double[] other) {
235         return Arrays.equals(own, other);
236     }
237 
238     /**
239      * {@code Object} array equality check.
240      * @param own the first array of {@code Object}s
241      * @param other the second array of {@code Object}s
242      * @return {@code true} if the two {@code Object} arrays are
243      *         equal, {@code false} otherwise
244      */
245     public static boolean isEqual(@Nullable final Object[] own,
246                                   @Nullable final Object[] other) {
247         return Arrays.equals(own, other);
248     }
249 
250     /**
251      * Creates a {@linkplain Object#hashCode() hash code} for the
252      * given {@code Object} according to the rules stated in "Effective
253      * Java" by Joshua Bloch.
254      * @param obj the object to compute the hash code for
255      * @return a hash code
256      */
257     public static int hash(@Nullable final Object obj) {
258         return obj == null ? 0 : obj.hashCode();
259     }
260 
261     /**
262      * Creates a {@linkplain Object#hashCode() hash code} for the
263      * given {@code boolean} according to the rules stated in "Effective
264      * Java" by Joshua Bloch.
265      * @param bool the object to compute the hash code for
266      * @return a hash code
267      */
268     public static int hash(final boolean bool) {
269         return bool ? 0 : HASH_MULTI * 1;
270     }
271 
272     /**
273      * Creates a {@linkplain Object#hashCode() hash code} for the
274      * given {@code byte} according to the rules stated in "Effective
275      * Java" by Joshua Bloch.
276      * @param b the object to compute the hash code for
277      * @return a hash code
278      */
279     public static int hash(final byte b) {
280         return HASH_MULTI * b;
281     }
282 
283     /**
284      * Creates a {@linkplain Object#hashCode() hash code} for the
285      * given {@code char} according to the rules stated in "Effective
286      * Java" by Joshua Bloch.
287      * @param c the object to compute the hash code for
288      * @return a hash code
289      */
290     public static int hash(final char c) {
291         return HASH_MULTI * c;
292     }
293 
294     /**
295      * Creates a {@linkplain Object#hashCode() hash code} for the
296      * given {@code short} according to the rules stated in "Effective
297      * Java" by Joshua Bloch.
298      * @param s the object to compute the hash code for
299      * @return a hash code
300      */
301     public static int hash(final short s) {
302         return HASH_MULTI * s;
303     }
304 
305     /**
306      * Creates a {@linkplain Object#hashCode() hash code} for the
307      * given {@code int} according to the rules stated in "Effective
308      * Java" by Joshua Bloch.
309      * @param i the object to compute the hash code for
310      * @return a hash code
311      */
312     public static int hash(final int i) {
313         return HASH_MULTI * i;
314     }
315 
316     /**
317      * Creates a {@linkplain Object#hashCode() hash code} for the
318      * given {@code long} according to the rules stated in "Effective
319      * Java" by Joshua Bloch.
320      * @param l the object to compute the hash code for
321      * @return a hash code
322      */
323     public static int hash(final long l) {
324         return (int) (HASH_MULTI * (l ^ (l >>> HASH_SHIFT)));
325     }
326 
327     /**
328      * Creates a {@linkplain Object#hashCode() hash code} for the
329      * given {@code float} according to the rules stated in "Effective
330      * Java" by Joshua Bloch.
331      * @param f the object to compute the hash code for
332      * @return a hash code
333      */
334     public static int hash(final float f) {
335         final int i = Float.floatToIntBits(f);
336         return EqualsAndHashUtil.hash(i);
337     }
338 
339     /**
340      * Creates a {@linkplain Object#hashCode() hash code} for the
341      * given {@code double} according to the rules stated in "Effective
342      * Java" by Joshua Bloch.
343      * @param d the object to compute the hash code for
344      * @return a hash code
345      */
346     public static int hash(final double d) {
347         final long l = Double.doubleToLongBits(d);
348         return EqualsAndHashUtil.hash(l);
349     }
350 
351     /**
352      * Creates a {@linkplain Object#hashCode() hash code} for the
353      * given array of {@code Object}s according to the rules stated in
354      * "Effective Java" by Joshua Bloch.
355      * @param arr the array of {@code Object}s to compute the hash code for
356      * @return a hash code
357      */
358     public static int hash(@Nullable final Object[] arr) {
359         int hashCode = 0;
360         if (arr != null) {
361             for (int i = arr.length; i >= 0; i--) {
362                 hashCode += EqualsAndHashUtil.hash(arr[i]);
363             }
364         }
365         return hashCode;
366     }
367 
368     /**
369      * Creates a {@linkplain Object#hashCode() hash code} for the
370      * given array of {@code boolean}s according to the rules stated in
371      * "Effective Java" by Joshua Bloch.
372      * @param arr the array of {@code boolean}s to compute the hash code
373      * @return a hash code
374      */
375     public static int hash(@Nullable final boolean[] arr) {
376         int hashCode = 0;
377         if (arr != null) {
378             for (int i = arr.length; i >= 0; i--) {
379                 hashCode += EqualsAndHashUtil.hash(arr[i]);
380             }
381         }
382         return hashCode;
383     }
384 
385     /**
386      * Creates a {@linkplain Object#hashCode() hash code} for the
387      * given array of {@code byte}s according to the rules stated in
388      * "Effective Java" by Joshua Bloch.
389      * @param arr the array of {@code byte}s to compute the hash code for
390      * @return a hash code
391      */
392     public static int hash(@Nullable final byte[] arr) {
393         int hashCode = 0;
394         if (arr != null) {
395             for (int i = arr.length; i >= 0; i--) {
396                 hashCode += EqualsAndHashUtil.hash(arr[i]);
397             }
398         }
399         return hashCode;
400     }
401 
402     /**
403      * Creates a {@linkplain Object#hashCode() hash code} for the
404      * given array of {@code char}s according to the rules stated in
405      * "Effective Java" by Joshua Bloch.
406      * @param arr the array of {@code char}s to compute the hash code for
407      * @return a hash code
408      */
409     public static int hash(@Nullable final char[] arr) {
410         int hashCode = 0;
411         if (arr != null) {
412             for (int i = arr.length; i >= 0; i--) {
413                 hashCode += EqualsAndHashUtil.hash(arr[i]);
414             }
415         }
416         return hashCode;
417     }
418 
419     /**
420      * Creates a {@linkplain Object#hashCode() hash code} for the
421      * given array of {@code short}s according to the rules stated in
422      * "Effective Java" by Joshua Bloch.
423      * @param arr the array of {@code short}s to compute the hash code for
424      * @return a hash code
425      */
426     public static int hash(@Nullable final short[] arr) {
427         int hashCode = 0;
428         if (arr != null) {
429             for (int i = arr.length; i >= 0; i--) {
430                 hashCode += EqualsAndHashUtil.hash(arr[i]);
431             }
432         }
433         return hashCode;
434     }
435 
436     /**
437      * Creates a {@linkplain Object#hashCode() hash code} for the
438      * given array of {@code int}s according to the rules stated in
439      * "Effective Java" by Joshua Bloch.
440      * @param arr the array of {@code int}s to compute the hash code for
441      * @return a hash code
442      */
443     public static int hash(@Nullable final int[] arr) {
444         int hashCode = 0;
445         if (arr != null) {
446             for (int i = arr.length; i >= 0; i--) {
447                 hashCode += EqualsAndHashUtil.hash(arr[i]);
448             }
449         }
450         return hashCode;
451     }
452 
453     /**
454      * Creates a {@linkplain Object#hashCode() hash code} for the
455      * given array of {@code long}s according to the rules stated in
456      * "Effective Java" by Joshua Bloch.
457      * @param arr the array of {@code long}s to compute the hash code for
458      * @return a hash code
459      */
460     public static int hash(@Nullable final long[] arr) {
461         int hashCode = 0;
462         if (arr != null) {
463             for (int i = arr.length; i >= 0; i--) {
464                 hashCode += EqualsAndHashUtil.hash(arr[i]);
465             }
466         }
467         return hashCode;
468     }
469 
470     /**
471      * Creates a {@linkplain Object#hashCode() hash code} for the
472      * given array of {@code float}s according to the rules stated in
473      * "Effective Java" by Joshua Bloch.
474      * @param arr the array of {@code float}s to compute the hash code for
475      * @return a hash code
476      */
477     public static int hash(@Nullable final float[] arr) {
478         int hashCode = 0;
479         if (arr != null) {
480             for (int i = arr.length; i >= 0; i--) {
481                 hashCode += EqualsAndHashUtil.hash(arr[i]);
482             }
483         }
484         return hashCode;
485     }
486 
487     /**
488      * Creates a {@linkplain Object#hashCode() hash code} for the
489      * given array of {@code double}s according to the rules stated in
490      * "Effective Java" by Joshua Bloch.
491      * @param arr the array of {@code double}s to compute the hash code for
492      * @return a hash code
493      */
494     public static int hash(@Nullable final double[] arr) {
495         int hashCode = 0;
496         if (arr != null) {
497             for (int i = arr.length; i >= 0; i--) {
498                 hashCode += EqualsAndHashUtil.hash(arr[i]);
499             }
500         }
501         return hashCode;
502     }
503 }