Quellcode durchsuchen

Adde equals/hashcode to delegate specifications to uphold the value object contract in RouteSpecification.

peter_backlund vor 17 Jahren
Ursprung
Commit
3ba6162743

+ 36
- 21
dddsample/tracking/core/src/main/java/se/citerus/dddsample/tracking/core/domain/model/cargo/RouteSpecification.java Datei anzeigen

@@ -3,6 +3,7 @@ package se.citerus.dddsample.tracking.core.domain.model.cargo;
3 3
 import org.apache.commons.lang.Validate;
4 4
 import se.citerus.dddsample.tracking.core.domain.model.location.Location;
5 5
 import se.citerus.dddsample.tracking.core.domain.patterns.specification.AbstractSpecification;
6
+import se.citerus.dddsample.tracking.core.domain.patterns.specification.Specification;
6 7
 import se.citerus.dddsample.tracking.core.domain.patterns.valueobject.ValueObjectSupport;
7 8
 
8 9
 import java.util.Date;
@@ -17,10 +18,11 @@ public class RouteSpecification extends ValueObjectSupport<RouteSpecification> {
17 18
   private final Location destination;
18 19
   private final Date arrivalDeadline;
19 20
 
20
-  private final NotNullSpecification notNull = new NotNullSpecification();
21
-  private final SameOriginSpecification sameOrigin = new SameOriginSpecification();
22
-  private final SameDestinationSpecification sameDestination = new SameDestinationSpecification();
23
-  private final MeetsDeadlineSpecification meetsDeadline = new MeetsDeadlineSpecification();
21
+  // Delegate specifications
22
+  private final Specification<Itinerary> notNull = new NotNullSpecification();
23
+  private final Specification<Itinerary> sameOrigin = new SameOriginSpecification();
24
+  private final Specification<Itinerary> sameDestination = new SameDestinationSpecification();
25
+  private final Specification<Itinerary> meetsDeadline = new MeetsDeadlineSpecification();
24 26
 
25 27
   /**
26 28
    * @param origin          origin location - can't be the same as the destination
@@ -39,6 +41,15 @@ public class RouteSpecification extends ValueObjectSupport<RouteSpecification> {
39 41
   }
40 42
 
41 43
   /**
44
+   * @param itinerary itinerary
45
+   * @return True if this route specification is satisfied by the itinerary,
46
+   *         i.e. the cargo will be delivered according to requirements.
47
+   */
48
+  public boolean isSatisfiedBy(final Itinerary itinerary) {
49
+    return notNull.and(sameOrigin).and(sameDestination).and(meetsDeadline).isSatisfiedBy(itinerary);
50
+  }
51
+
52
+  /**
42 53
    * @return Specified origin location.
43 54
    */
44 55
   public Location origin() {
@@ -83,15 +94,6 @@ public class RouteSpecification extends ValueObjectSupport<RouteSpecification> {
83 94
     return new RouteSpecification(origin, destination, newArrivalDeadline);
84 95
   }
85 96
 
86
-  /**
87
-   * @param itinerary itinerary
88
-   * @return True if this route specification is satisfied by the itinerary,
89
-   *         i.e. the cargo will be delivered according to requirements.
90
-   */
91
-  public boolean isSatisfiedBy(final Itinerary itinerary) {
92
-    return notNull.and(sameOrigin).and(sameDestination).and(meetsDeadline).isSatisfiedBy(itinerary);
93
-  }
94
-
95 97
   @Override
96 98
   public String toString() {
97 99
     return origin + " to " + destination + " by " + arrivalDeadline;
@@ -103,32 +105,45 @@ public class RouteSpecification extends ValueObjectSupport<RouteSpecification> {
103 105
     arrivalDeadline = null;
104 106
   }
105 107
 
106
-  private class NotNullSpecification extends AbstractSpecification<Itinerary> {
108
+  // --- Private classes ---
109
+  
110
+  private final class NotNullSpecification extends FieldlessSpecification {
107 111
     @Override
108
-    public boolean isSatisfiedBy(final Itinerary itinerary) {
112
+    public final boolean isSatisfiedBy(final Itinerary itinerary) {
109 113
       return itinerary != null;
110 114
     }
111 115
   }
112 116
 
113
-  private class SameOriginSpecification extends AbstractSpecification<Itinerary> {
117
+  private final class SameOriginSpecification extends FieldlessSpecification {
114 118
     @Override
115
-    public boolean isSatisfiedBy(final Itinerary itinerary) {
119
+    public final boolean isSatisfiedBy(final Itinerary itinerary) {
116 120
       return origin.sameAs(itinerary.initialLoadLocation());
117 121
     }
118 122
   }
119 123
 
120
-  private class SameDestinationSpecification extends AbstractSpecification<Itinerary> {
124
+  private final class SameDestinationSpecification extends FieldlessSpecification {
121 125
     @Override
122
-    public boolean isSatisfiedBy(final Itinerary itinerary) {
126
+    public final boolean isSatisfiedBy(final Itinerary itinerary) {
123 127
       return destination.sameAs(itinerary.finalUnloadLocation());
124 128
     }
125 129
   }
126 130
 
127
-  private class MeetsDeadlineSpecification extends AbstractSpecification<Itinerary> {
131
+  private final class MeetsDeadlineSpecification extends FieldlessSpecification {
128 132
     @Override
129
-    public boolean isSatisfiedBy(final Itinerary itinerary) {
133
+    public final boolean isSatisfiedBy(final Itinerary itinerary) {
130 134
       return arrivalDeadline.after(itinerary.finalUnloadTime());
131 135
     }
132 136
   }
133 137
 
138
+  private static abstract class FieldlessSpecification extends AbstractSpecification<Itinerary> {
139
+    @Override
140
+    public final boolean equals(final Object that) {
141
+      return that != null && this.getClass().equals(that.getClass());
142
+    }
143
+    @Override
144
+    public final int hashCode() {
145
+      return this.getClass().hashCode();
146
+    }
147
+  }
148
+
134 149
 }