1 package org.pojomatic.annotations;
2
3 import java.util.Arrays;
4 import java.util.Collections;
5 import java.util.EnumSet;
6 import java.util.Set;
7
8 import org.pojomatic.Pojomatic;
9 import org.pojomatic.internal.PropertyRole;
10
11 /**
12 * A policy for defining which sets of {@link Pojomatic} operations
13 * ({@code equals}, {@code hashCode} and {@code toString}) should use a property.
14 * This is set using {@link Property}.
15 * @see DefaultPojomaticPolicy
16 */
17 public enum PojomaticPolicy {
18
19 /**
20 * Use the property for both {@code hashCode} and {@code equals}.
21 * Anything included in {@code public int hashCode()} should also be included in
22 * {@code public boolean equals(Object)} to preserve the general
23 * contract of {@link Object#hashCode()}.
24 *
25 * @see Object#hashCode()
26 * @see Object#equals(Object)
27 */
28 HASHCODE_EQUALS(PropertyRole.HASH_CODE, PropertyRole.EQUALS),
29
30 /**
31 * Use the property for both {@code equals} and {@code toString}.
32 *
33 * @see Object#equals(Object)
34 * @see Object#toString()
35 */
36 EQUALS_TO_STRING(PropertyRole.EQUALS, PropertyRole.TO_STRING),
37
38
39 /**
40 * Use the property for {@code equals} only.
41 *
42 * @see Object#equals(Object)
43 */
44 EQUALS(PropertyRole.EQUALS),
45
46 /**
47 * Use the property for both {@code toString} only.
48 *
49 * @see Object#toString()
50 */
51 TO_STRING(PropertyRole.TO_STRING),
52
53 /**
54 * Use the property for {@code hashCode}, {@code equals} and {@code toString}.
55 */
56 ALL(PropertyRole.EQUALS, PropertyRole.HASH_CODE, PropertyRole.TO_STRING),
57
58 /**
59 * Do not use the property for any of {@code hashCode}, {@code equals} or {@code toString}.
60 */
61 NONE(),
62
63 /**
64 * Use the default policy specified via the {@code @AutoProperty} annotation, or
65 * {@code ALL} if none was specified.
66 */
67 DEFAULT {
68 @Override public Set<PropertyRole> getRoles() {
69 return null;
70 }
71 };
72
73
74 /**
75 * @return the roles this specified by this policy. Will be {@code null} for {@code DEFAULT}.
76 */
77 public Set<PropertyRole> getRoles() {
78 return roles;
79 }
80
81 private PojomaticPolicy(PropertyRole... roles) {
82 Set<PropertyRole> roleSet = EnumSet.noneOf(PropertyRole.class);
83 roleSet.addAll(Arrays.asList(roles));
84 this.roles = Collections.unmodifiableSet(roleSet);
85 }
86
87 private final Set<PropertyRole> roles;
88 }