Ordered.java
01 /*
02  * Java Genetic Algorithm Library (jenetics-8.0.0).
03  * Copyright (c) 2007-2024 Franz Wilhelmstötter
04  *
05  * Licensed under the Apache License, Version 2.0 (the "License");
06  * you may not use this file except in compliance with the License.
07  * You may obtain a copy of the License at
08  *
09  *      http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  * Author:
18  *    Franz Wilhelmstötter (franz.wilhelmstoetter@gmail.com)
19  */
20 package io.jenetics.util;
21 
22 import static java.util.Objects.requireNonNull;
23 
24 import java.util.Comparator;
25 import java.util.function.Supplier;
26 
27 /**
28  * Object wrapper, which makes the wrapped value {@link Comparable}, by defining
29  * a separate {@link Comparator}.
30  *
31  @param <T> the type of the wrapped object
32  *
33  @author <a href="mailto:franz.wilhelmstoetter@gmail.com">Franz Wilhelmstötter</a>
34  @version 6.3
35  @since 6.3
36  */
37 public final class Ordered<T> implements Comparable<Ordered<T>>, Supplier<T> {
38     private final T _value;
39     private final Comparator<? super T> _comparator;
40 
41     private Ordered(final T value, final Comparator<? super T> comparator) {
42         _value = value;
43         _comparator = requireNonNull(comparator);
44     }
45 
46     /**
47      * Return the wrapped value.
48      *
49      @return the wrapped value
50      */
51     @Override
52     public T get() {
53         return _value;
54     }
55 
56     @Override
57     public int compareTo(final Ordered<T> other) {
58         return _comparator.compare(_value, other._value);
59     }
60 
61     /**
62      * Make the given {@code value} comparable, by using the given
63      * {@code comparator}.
64      *
65      @param value the wrapped object, may be {@code null}
66      @param comparator the comparator used for comparing two value objects
67      @param <T> the type of the wrapped object
68      @return a new ordered object
69      @throws NullPointerException if the given {@code comparator} is
70      *         {@code null}
71      */
72     public static <T> Ordered<T> of(
73         final T value,
74         final Comparator<? super T> comparator
75     ) {
76         return new Ordered<>(value, comparator);
77     }
78 
79 }