2424 *
2525 * @param <T> the element type
2626 */
27- public final class ParetoSet <T > extends AbstractCollection <T > {
27+ public sealed class ParetoSet <T > extends AbstractCollection <T > permits ParetoSetWithListener {
2828
2929 private final ParetoComparator <T > comparator ;
3030
31- @ Nullable
32- private final ParetoSetEventListener <? super T > eventListener ;
33-
3431 @ SuppressWarnings ("unchecked" )
3532 private T [] elements = (T []) new Object [16 ];
3633
@@ -40,23 +37,15 @@ public final class ParetoSet<T> extends AbstractCollection<T> {
4037
4138 private int marker = 0 ;
4239
43- private ParetoSet (
44- ParetoComparator <T > comparator ,
45- @ Nullable ParetoSetEventListener <? super T > eventListener
46- ) {
40+ protected ParetoSet (ParetoComparator <T > comparator ) {
4741 this .comparator = comparator ;
48- this .eventListener = eventListener ;
49- }
50-
51- private ParetoSet (ParetoComparator <T > comparator ) {
52- this (comparator , null );
5342 }
5443
5544 /**
5645 * Create a new ParetoSet with a comparator.
5746 */
5847 public static <T > ParetoSet <T > of (ParetoComparator <T > comparator ) {
59- return of (comparator , null );
48+ return new ParetoSet <> (comparator );
6049 }
6150
6251 /**
@@ -69,10 +58,12 @@ public static <T> ParetoSet<T> of(
6958 ParetoComparator <T > comparator ,
7059 @ Nullable ParetoSetEventListener <? super T > eventListener
7160 ) {
72- return new ParetoSet <>(comparator , eventListener );
61+ return eventListener == null
62+ ? of (comparator )
63+ : new ParetoSetWithListener <>(comparator , eventListener );
7364 }
7465
75- public T get (int index ) {
66+ public final T get (int index ) {
7667 return elements [index ];
7768 }
7869
@@ -97,11 +88,11 @@ public Iterator iterator() {
9788 }
9889 */
9990
100- public int size () {
91+ public final int size () {
10192 return size ;
10293 }
10394
104- public boolean isEmpty () {
95+ public final boolean isEmpty () {
10596 return size == 0 ;
10697 }
10798
@@ -111,7 +102,7 @@ public Stream<T> stream() {
111102 }
112103 */
113104
114- public boolean add (T newValue ) {
105+ public final boolean add (T newValue ) {
115106 if (size == 0 ) {
116107 acceptAndAppendValue (newValue );
117108 return true ;
@@ -164,7 +155,7 @@ public void addAll(Collection<T> elements) {
164155 }
165156 }*/
166157
167- public void clear () {
158+ public final void clear () {
168159 size = 0 ;
169160 goodElement = null ;
170161 marker = 0 ;
@@ -181,7 +172,7 @@ public String toString() {
181172 * <p/>
182173 * Both methods are optimized for performance; hence the add method does not use this method.
183174 */
184- public boolean qualify (T newValue ) {
175+ public final boolean qualify (T newValue ) {
185176 if (size == 0 ) {
186177 return true ;
187178 }
@@ -243,7 +234,7 @@ public String toString(Function<? super T, String> toStringMapper) {
243234 * Notify subclasses about reindexing. This method is empty, and only exist for subclasses to
244235 * override it.
245236 */
246- private void notifyElementMoved (int fromIndex , int toIndex ) {
237+ private final void notifyElementMoved (int fromIndex , int toIndex ) {
247238 if (fromIndex == marker ) {
248239 marker = toIndex ;
249240 }
@@ -272,7 +263,7 @@ final Iterable<T> tail(final int startIndexInclusive) {
272263 * is changed the returned values of the iterator also changes. Do not update on this collection
273264 * while using this iterator.
274265 */
275- private Iterator <T > tailIterator (final int startInclusive ) {
266+ private final Iterator <T > tailIterator (final int startInclusive ) {
276267 return new Iterator <>() {
277268 int i = startInclusive ;
278269
@@ -292,7 +283,7 @@ public T next() {
292283 * Remove all elements dominated by the {@code newValue} starting from {@code index + 1}. The
293284 * element at {@code index} is dropped.
294285 */
295- private void removeDominatedElementsFromRestOfSetAndAddNewElement (
286+ private final void removeDominatedElementsFromRestOfSetAndAddNewElement (
296287 final T newValue ,
297288 final int index
298289 ) {
@@ -321,62 +312,50 @@ private void removeDominatedElementsFromRestOfSetAndAddNewElement(
321312 size = i + 1 ;
322313 }
323314
324- private boolean leftVectorDominatesRightVector (T left , T right ) {
315+ private final boolean leftVectorDominatesRightVector (T left , T right ) {
325316 return leftDominanceExist (left , right ) && !rightDominanceExist (left , right );
326317 }
327318
328- private void acceptAndAppendValue (T newValue ) {
319+ private final void acceptAndAppendValue (T newValue ) {
329320 notifyElementAccepted (newValue );
330321 elements [size ++] = newValue ;
331322 }
332323
333- private void assertEnoughSpaceInSet () {
324+ private final void assertEnoughSpaceInSet () {
334325 if (size == elements .length ) {
335326 elements = Arrays .copyOf (elements , elements .length * 2 );
336327 }
337328 }
338329
339- private boolean leftDominanceExist (T left , T right ) {
330+ private final boolean leftDominanceExist (T left , T right ) {
340331 return comparator .leftDominanceExist (left , right );
341332 }
342333
343- private boolean rightDominanceExist (T left , T right ) {
334+ private final boolean rightDominanceExist (T left , T right ) {
344335 return comparator .leftDominanceExist (right , left );
345336 }
346337
347- private void notifyElementAccepted (T newElement ) {
348- if (eventListener != null ) {
349- eventListener .notifyElementAccepted (newElement );
350- }
351- }
338+ protected void notifyElementAccepted (T newElement ) {}
352339
353- private void notifyElementDropped (T element , T droppedByElement ) {
354- if (eventListener != null ) {
355- eventListener .notifyElementDropped (element , droppedByElement );
356- }
357- }
340+ protected void notifyElementDropped (T element , T droppedByElement ) {}
358341
359- private void notifyElementRejected (T element , T rejectByElement ) {
360- if (eventListener != null ) {
361- eventListener .notifyElementRejected (element , rejectByElement );
362- }
363- }
342+ protected void notifyElementRejected (T element , T rejectByElement ) {}
364343
365- public boolean hasElementsAfterMarker () {
344+ public final boolean hasElementsAfterMarker () {
366345 return marker != size ();
367346 }
368347
369348 /**
370349 * List all elements added after the marker.
371350 */
372- public Iterable <T > elementsAfterMarker () {
351+ public final Iterable <T > elementsAfterMarker () {
373352 return tail (marker );
374353 }
375354
376355 /**
377356 * Move the marker after the last element in the set.
378357 */
379- public void markAtEndOfSet () {
358+ public final void markAtEndOfSet () {
380359 marker = size ();
381360 }
382361}
0 commit comments