summaryrefslogtreecommitdiff
path: root/src/org/unitConverter/unit/Unit.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/org/unitConverter/unit/Unit.java')
-rw-r--r--src/org/unitConverter/unit/Unit.java118
1 files changed, 70 insertions, 48 deletions
diff --git a/src/org/unitConverter/unit/Unit.java b/src/org/unitConverter/unit/Unit.java
index eb9b000..0a3298f 100644
--- a/src/org/unitConverter/unit/Unit.java
+++ b/src/org/unitConverter/unit/Unit.java
@@ -16,12 +16,10 @@
*/
package org.unitConverter.unit;
-import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Objects;
-import java.util.Optional;
import java.util.Set;
import java.util.function.DoubleUnaryOperator;
@@ -34,7 +32,7 @@ import org.unitConverter.math.ObjectProduct;
* @author Adrien Hopkins
* @since 2019-10-16
*/
-public abstract class Unit {
+public abstract class Unit implements Nameable {
/**
* Returns a unit from its base and the functions it uses to convert to and
* from its base.
@@ -98,19 +96,11 @@ public abstract class Unit {
private final ObjectProduct<BaseUnit> unitBase;
/**
- * The primary name used by this unit.
- */
- private final Optional<String> primaryName;
-
- /**
- * A short symbol used to represent this unit.
- */
- private final Optional<String> symbol;
-
- /**
- * A set of any additional names and/or spellings that the unit uses.
+ * This unit's name(s) and symbol
+ *
+ * @since 2020-09-07
*/
- private final Set<String> otherNames;
+ private final NameSymbol nameSymbol;
/**
* Cache storing the result of getDimension()
@@ -120,20 +110,17 @@ public abstract class Unit {
private transient ObjectProduct<BaseDimension> dimension = null;
/**
- * Creates the {@code AbstractUnit}.
+ * Creates the {@code Unit}.
*
* @param unitBase base of unit
* @param ns names and symbol of unit
* @since 2019-10-16
* @throws NullPointerException if unitBase or ns is null
*/
- protected Unit(final ObjectProduct<BaseUnit> unitBase, final NameSymbol ns) {
+ Unit(ObjectProduct<BaseUnit> unitBase, NameSymbol ns) {
this.unitBase = Objects.requireNonNull(unitBase,
- "unitBase must not be null.");
- this.primaryName = Objects.requireNonNull(ns, "ns must not be null.")
- .getPrimaryName();
- this.symbol = ns.getSymbol();
- this.otherNames = ns.getOtherNames();
+ "unitBase may not be null");
+ this.nameSymbol = Objects.requireNonNull(ns, "ns may not be null");
}
/**
@@ -147,18 +134,25 @@ public abstract class Unit {
this.unitBase = ObjectProduct.oneOf((BaseUnit) this);
} else
throw new AssertionError();
- this.primaryName = Optional.of(primaryName);
- this.symbol = Optional.of(symbol);
- this.otherNames = Collections.unmodifiableSet(new HashSet<>(Objects
- .requireNonNull(otherNames, "additionalNames must not be null.")));
+ this.nameSymbol = NameSymbol.of(primaryName, symbol,
+ new HashSet<>(otherNames));
+ }
+
+ /**
+ * @return this unit as a {@link Unitlike}
+ * @since 2020-09-07
+ */
+ public final Unitlike<Double> asUnitlike() {
+ return Unitlike.fromConversionFunctions(this.getBase(),
+ this::convertFromBase, this::convertToBase, this.getNameSymbol());
}
/**
* Checks if a value expressed in this unit can be converted to a value
* expressed in {@code other}
*
- * @param other unit to test with
- * @return true if the units are compatible
+ * @param other unit or unitlike form to test with
+ * @return true if they are compatible
* @since 2019-01-13
* @since v0.1.0
* @throws NullPointerException if other is null
@@ -169,6 +163,21 @@ public abstract class Unit {
}
/**
+ * Checks if a value expressed in this unit can be converted to a value
+ * expressed in {@code other}
+ *
+ * @param other unit or unitlike form to test with
+ * @return true if they are compatible
+ * @since 2019-01-13
+ * @since v0.1.0
+ * @throws NullPointerException if other is null
+ */
+ public final <W> boolean canConvertTo(final Unitlike<W> other) {
+ Objects.requireNonNull(other, "other must not be null.");
+ return Objects.equals(this.getBase(), other.getBase());
+ }
+
+ /**
* Converts from a value expressed in this unit's base unit to a value
* expressed in this unit.
* <p>
@@ -219,6 +228,34 @@ public abstract class Unit {
}
/**
+ * Converts a value expressed in this unit to a value expressed in
+ * {@code other}.
+ *
+ * @implSpec If conversion is possible, this implementation returns
+ * {@code other.convertFromBase(this.convertToBase(value))}.
+ * Therefore, overriding either of those methods will change the
+ * output of this method.
+ *
+ * @param other unitlike form to convert to
+ * @param value value to convert
+ * @param <W> type of value to convert to
+ * @return converted value
+ * @since 2020-09-07
+ * @throws IllegalArgumentException if {@code other} is incompatible for
+ * conversion with this unit (as tested by
+ * {@link Unit#canConvertTo}).
+ * @throws NullPointerException if other is null
+ */
+ public final <W> W convertTo(final Unitlike<W> other, final double value) {
+ Objects.requireNonNull(other, "other must not be null.");
+ if (this.canConvertTo(other))
+ return other.convertFromBase(this.convertToBase(value));
+ else
+ throw new IllegalArgumentException(
+ String.format("Cannot convert from %s to %s.", this, other));
+ }
+
+ /**
* Converts from a value expressed in this unit to a value expressed in this
* unit's base unit.
* <p>
@@ -270,27 +307,12 @@ public abstract class Unit {
}
/**
- * @return additionalNames
- * @since 2019-10-21
- */
- public final Set<String> getOtherNames() {
- return this.otherNames;
- }
-
- /**
- * @return primaryName
- * @since 2019-10-21
+ * @return the nameSymbol
+ * @since 2020-09-07
*/
- public final Optional<String> getPrimaryName() {
- return this.primaryName;
- }
-
- /**
- * @return symbol
- * @since 2019-10-21
- */
- public final Optional<String> getSymbol() {
- return this.symbol;
+ @Override
+ public final NameSymbol getNameSymbol() {
+ return this.nameSymbol;
}
/**