From ea940f2c5b6450231ff9ce61f4b6704babdb0d9e Mon Sep 17 00:00:00 2001 From: Adrien Hopkins Date: Mon, 18 Mar 2019 16:43:36 -0400 Subject: Created an OperatableUnit interface for units that can operate. --- src/org/unitConverter/unit/LinearUnit.java | 57 +++++++++++++++++++++++++++++- 1 file changed, 56 insertions(+), 1 deletion(-) (limited to 'src/org/unitConverter/unit/LinearUnit.java') diff --git a/src/org/unitConverter/unit/LinearUnit.java b/src/org/unitConverter/unit/LinearUnit.java index ab46f1e..64eff1f 100644 --- a/src/org/unitConverter/unit/LinearUnit.java +++ b/src/org/unitConverter/unit/LinearUnit.java @@ -27,7 +27,7 @@ import org.unitConverter.dimension.UnitDimension; * @since 2018-12-22 * @since v0.1.0 */ -public final class LinearUnit extends AbstractUnit { +public final class LinearUnit extends AbstractUnit implements OperatableUnit { /** * The value of one of this unit in this unit's base unit * @@ -134,6 +134,40 @@ public final class LinearUnit extends AbstractUnit { return result; } + @Override + public LinearUnit negated() { + return new LinearUnit(this.getBase(), -this.getConversionFactor()); + } + + @Override + public OperatableUnit plus(final OperatableUnit addend) { + Objects.requireNonNull(addend, "addend must not be null."); + + // reject addends that cannot be added to this unit + if (!this.getSystem().equals(addend.getSystem())) + throw new IllegalArgumentException( + String.format("Incompatible units for addition or subtraction \"%s\" and \"%s\".", this, addend)); + if (!this.getDimension().equals(addend.getDimension())) + throw new IllegalArgumentException( + String.format("Incompatible units for addition or subtraction \"%s\" and \"%s\".", this, addend)); + + // add the units + if (addend instanceof BaseUnit) + // since addend's dimension is equal to this unit's dimension, and there is only one base unit per + // system-dimension, addend must be this unit's base. + return new LinearUnit(this.getBase(), this.getConversionFactor() + 1); + else if (addend instanceof LinearUnit) + return new LinearUnit(this.getBase(), + this.getConversionFactor() + ((LinearUnit) addend).getConversionFactor()); + else + return addend.times(this); + } + + @Override + public LinearUnit reciprocal() { + return this.toExponent(-1); + } + /** * Multiplies this unit by a scalar. * @@ -164,6 +198,26 @@ public final class LinearUnit extends AbstractUnit { return new LinearUnit(base, this.getConversionFactor() * other.getConversionFactor()); } + @Override + public OperatableUnit times(final OperatableUnit multiplier) { + Objects.requireNonNull(multiplier, "multiplier must not be null."); + + // reject multipliers that cannot be muliplied by this unit + if (!this.getSystem().equals(multiplier.getSystem())) + throw new IllegalArgumentException(String + .format("Incompatible units for multiplication or division \"%s\" and \"%s\".", this, multiplier)); + + // multiply the units + if (multiplier instanceof BaseUnit) { + final BaseUnit newBase = this.getBase().times((BaseUnit) multiplier); + return new LinearUnit(newBase, this.getConversionFactor()); + } else if (multiplier instanceof LinearUnit) { + final BaseUnit base = this.getBase().times(multiplier.getBase()); + return new LinearUnit(base, this.getConversionFactor() * ((LinearUnit) multiplier).getConversionFactor()); + } else + return multiplier.times(this); + } + /** * Returns this unit but to an exponent. * @@ -173,6 +227,7 @@ public final class LinearUnit extends AbstractUnit { * @since 2019-01-15 * @since v0.1.0 */ + @Override public LinearUnit toExponent(final int exponent) { return new LinearUnit(this.getBase().toExponent(exponent), Math.pow(this.conversionFactor, exponent)); } -- cgit v1.2.3