public abstract class AbstractQuantity<Q extends javax.measure.Quantity<Q>> extends java.lang.Object implements ComparableQuantity<Q>, tec.uom.lib.common.function.UnitSupplier<Q>, tec.uom.lib.common.function.ValueSupplier<java.lang.Number>
This class represents the immutable result of a scalar measurement stated in a known unit.
To avoid any lost of precision, known exact measure (e.g. physical constants) should not be created from double
constants but from
their decimal representation.
public static final Quantity
Measures can be converted to different units, the conversion precision is determined by the specified MathContext
.
Quantity
If no precision is specified double
precision is assumed.
Quantity
Applications may sub-class AbstractQuantity
for particular quantity types.
// Quantity of type Mass based on
double
primitive types. public class MassAmount extends AbstractQuantityextends AbstractQuantity
{ public Complex getValue() { ... } // Assuming Complex is a Number. ... }
// Specializations of complex numbers quantities. public class Current extends ComplexQuantity
All instances of this class shall be immutable.
Modifier and Type | Field and Description |
---|---|
static javax.measure.Quantity<javax.measure.quantity.Dimensionless> |
NONE
Holds a dimensionless quantity of none (exact).
|
static javax.measure.Quantity<javax.measure.quantity.Dimensionless> |
ONE
Holds a dimensionless quantity of one (exact).
|
private static long |
serialVersionUID |
private javax.measure.Unit<Q> |
unit |
Modifier | Constructor and Description |
---|---|
protected |
AbstractQuantity(javax.measure.Unit<Q> unit)
constructor.
|
Modifier and Type | Method and Description |
---|---|
<T extends javax.measure.Quantity<T>> |
asType(java.lang.Class<T> type)
Casts this quantity to a parameterized quantity of specified nature or throw a
ClassCastException if the dimension of the specified
quantity and its unit's dimension do not match. |
int |
compareTo(javax.measure.Quantity<Q> that)
Compares this measure to the specified Measurement quantity.
|
abstract java.math.BigDecimal |
decimalValue(javax.measure.Unit<Q> unit,
java.math.MathContext ctx) |
<T extends javax.measure.Quantity<T>,E extends javax.measure.Quantity<E>> |
divide(javax.measure.Quantity<T> that,
java.lang.Class<E> asTypeQuantity)
Multiply and cast the
ComparableQuantity |
abstract double |
doubleValue(javax.measure.Unit<Q> unit) |
boolean |
equals(AbstractQuantity<Q> that,
double epsilon,
javax.measure.Unit<Q> epsilonUnit)
Compares this measure and the specified Measurement to the given accuracy.
|
boolean |
equals(java.lang.Object obj)
Compares this measure against the specified object for strict equality (same unit and same amount).
|
protected float |
floatValue(javax.measure.Unit<Q> unit) |
javax.measure.Unit<Q> |
getUnit()
Returns the measurement unit.
|
abstract java.lang.Number |
getValue()
Returns the numeric value of the quantity.
|
int |
hashCode()
Returns the hash code for this measure.
|
int |
intValue(javax.measure.Unit<Q> unit) |
<T extends javax.measure.Quantity<T>> |
inverse(java.lang.Class<T> quantityClass)
invert and already cast to defined quantityClass
|
abstract boolean |
isBig() |
boolean |
isEquivalentTo(javax.measure.Quantity<Q> that)
Compares two instances of
, doing the conversion of unit if necessary. |
boolean |
isGreaterThan(javax.measure.Quantity<Q> that)
Compares two instances of
. |
boolean |
isGreaterThanOrEqualTo(javax.measure.Quantity<Q> that)
Compares two instances of
, doing the conversion of unit if necessary. |
boolean |
isLessThan(javax.measure.Quantity<Q> that)
Compares two instances of
, doing the conversion of unit if necessary. |
boolean |
isLessThanOrEqualTo(javax.measure.Quantity<Q> that)
Compares two instances of
, doing the conversion of unit if necessary. |
protected long |
longValue(javax.measure.Unit<Q> unit) |
<T extends javax.measure.Quantity<T>,E extends javax.measure.Quantity<E>> |
multiply(javax.measure.Quantity<T> that,
java.lang.Class<E> asTypeQuantity)
Divide and cast the
ComparableQuantity |
static javax.measure.Quantity<?> |
parse(java.lang.CharSequence csq)
Returns the quantity of unknown type corresponding to the specified representation.
|
ComparableQuantity<Q> |
to(javax.measure.Unit<Q> unit)
Returns this measure after conversion to specified unit.
|
javax.measure.Quantity<Q> |
to(javax.measure.Unit<Q> unit,
java.math.MathContext ctx)
Returns this measure after conversion to specified unit.
|
javax.measure.Quantity<Q> |
toSI()
Convenient method equivalent to
to(this.getUnit().toSI()) . |
java.lang.String |
toString()
Returns the
String representation of this measure. |
private static final long serialVersionUID
public static final javax.measure.Quantity<javax.measure.quantity.Dimensionless> NONE
public static final javax.measure.Quantity<javax.measure.quantity.Dimensionless> ONE
protected AbstractQuantity(javax.measure.Unit<Q> unit)
public abstract java.lang.Number getValue()
public javax.measure.Unit<Q> getUnit()
public javax.measure.Quantity<Q> toSI()
to(this.getUnit().toSI())
.java.lang.ArithmeticException
- if the result is inexact and the quotient has a non-terminating decimal expansion.public ComparableQuantity<Q> to(javax.measure.Unit<Q> unit)
Measure.valueOf(doubleValue(unit), unit)
. If this measure is already stated in the specified unit, then this measure is returned and no conversion is performed.to
in interface javax.measure.Quantity<Q extends javax.measure.Quantity<Q>>
to
in interface ComparableQuantity<Q extends javax.measure.Quantity<Q>>
unit
- the unit in which the returned measure is stated.java.lang.ArithmeticException
- if the result is inexact and the quotient has a non-terminating decimal expansion.Quantity.to(Unit)
public javax.measure.Quantity<Q> to(javax.measure.Unit<Q> unit, java.math.MathContext ctx)
Measure.valueOf(decimalValue(unit, ctx), unit)
. If this measure is already stated in the specified unit, then this measure is
returned and no conversion is performed.unit
- the unit in which the returned measure is stated.ctx
- the math context to use for conversion.java.lang.ArithmeticException
- if the result is inexact but the rounding mode is UNNECESSARY
or mathContext.precision == 0
and the quotient
has a non-terminating decimal expansion.public boolean isGreaterThan(javax.measure.Quantity<Q> that)
ComparableQuantity
. Conversion of unit can happen if necessaryisGreaterThan
in interface ComparableQuantity<Q extends javax.measure.Quantity<Q>>
that
- the quantity<Q>
to be compared with this instance.true
if that > this
.public boolean isGreaterThanOrEqualTo(javax.measure.Quantity<Q> that)
ComparableQuantity
, doing the conversion of unit if necessary.isGreaterThanOrEqualTo
in interface ComparableQuantity<Q extends javax.measure.Quantity<Q>>
that
- the quantity<Q>
to be compared with this instance.true
if that >= this
.public boolean isLessThan(javax.measure.Quantity<Q> that)
ComparableQuantity
, doing the conversion of unit if necessary.isLessThan
in interface ComparableQuantity<Q extends javax.measure.Quantity<Q>>
that
- the quantity<Q>
to be compared with this instance.true
if that < this
.public boolean isLessThanOrEqualTo(javax.measure.Quantity<Q> that)
ComparableQuantity
, doing the conversion of unit if necessary.isLessThanOrEqualTo
in interface ComparableQuantity<Q extends javax.measure.Quantity<Q>>
that
- the quantity<Q>
to be compared with this instance.true
if that < this
.public boolean isEquivalentTo(javax.measure.Quantity<Q> that)
ComparableQuantity
, doing the conversion of unit if necessary.isEquivalentTo
in interface ComparableQuantity<Q extends javax.measure.Quantity<Q>>
that
- the quantity<Q>
to be compared with this instance.true
if that < this
.public int compareTo(javax.measure.Quantity<Q> that)
doubleValue(Unit)
of both this measure and the specified Measurement stated in the same unit (this measure's unit
).public boolean equals(java.lang.Object obj)
Similarly to the BigDecimal.equals(java.lang.Object)
method which consider 2.0 and 2.00 as different objects because of different internal scales,
quantities such as Quantities.getQuantity(3.0, KILOGRAM)
Quantities.getQuantity(3, KILOGRAM)
and
Quantities.getQuantity("3 kg")
might not be considered equals because of possible differences in their implementations.
To compare measures stated using different units or using different amount implementations the compareTo
or
equals(Quantity, epsilon, epsilonUnit)
methods should be used.
equals
in class java.lang.Object
obj
- the object to compare with.this.getUnit.equals(obj.getUnit())
&& this.getValue().equals(obj.getValue())
public boolean equals(AbstractQuantity<Q> that, double epsilon, javax.measure.Unit<Q> epsilonUnit)
that
- the Measurement to compare with.epsilon
- the absolute error stated in epsilonUnit.epsilonUnit
- the epsilon unit.abs(this.doubleValue(epsilonUnit) - that.doubleValue(epsilonUnit)) <= epsilon
public int hashCode()
hashCode
in class java.lang.Object
public abstract boolean isBig()
public java.lang.String toString()
String
representation of this measure. The string produced for a given measure is always the same; it is not affected by
locale. This means that it can be used as a canonical string representation for exchanging measure, or as a key for a Hashtable, etc.
Locale-sensitive measure formatting and parsing is handled by the MeasurementFormat
class and its subclasses.toString
in class java.lang.Object
UnitFormat.getInternational().format(this)
public abstract java.math.BigDecimal decimalValue(javax.measure.Unit<Q> unit, java.math.MathContext ctx) throws java.lang.ArithmeticException
java.lang.ArithmeticException
public abstract double doubleValue(javax.measure.Unit<Q> unit) throws java.lang.ArithmeticException
java.lang.ArithmeticException
public final int intValue(javax.measure.Unit<Q> unit) throws java.lang.ArithmeticException
java.lang.ArithmeticException
protected long longValue(javax.measure.Unit<Q> unit) throws java.lang.ArithmeticException
java.lang.ArithmeticException
protected final float floatValue(javax.measure.Unit<Q> unit)
public <T extends javax.measure.Quantity<T>,E extends javax.measure.Quantity<E>> ComparableQuantity<E> divide(javax.measure.Quantity<T> that, java.lang.Class<E> asTypeQuantity)
ComparableQuantity
ComparableQuantity
divide
in interface ComparableQuantity<Q extends javax.measure.Quantity<Q>>
that
- quantity to be multipliedasTypeQuantity
- quantity to be convertedQuantity.divide(Quantity)
,
Quantity.asType(Class)
public <T extends javax.measure.Quantity<T>,E extends javax.measure.Quantity<E>> ComparableQuantity<E> multiply(javax.measure.Quantity<T> that, java.lang.Class<E> asTypeQuantity)
ComparableQuantity
ComparableQuantity
multiply
in interface ComparableQuantity<Q extends javax.measure.Quantity<Q>>
that
- quantity to be dividedasTypeQuantity
- quantity to be convertedQuantityOperations
,
QuantityOperations#of(Quantity, Class)
,
Quantity.asType(Class)
,
Quantity.multiply(Quantity)
public <T extends javax.measure.Quantity<T>> ComparableQuantity<T> inverse(java.lang.Class<T> quantityClass)
ComparableQuantity
inverse
in interface ComparableQuantity<Q extends javax.measure.Quantity<Q>>
quantityClass
- Quantity to be convertedQuantity.inverse()
,
Quantity.asType(Class)
public final <T extends javax.measure.Quantity<T>> ComparableQuantity<T> asType(java.lang.Class<T> type) throws java.lang.ClassCastException
ClassCastException
if the dimension of the specified
quantity and its unit's dimension do not match. For example:
Quantity length = AbstractQuantity.parse("2 km").asType(Length.class);
asType
in interface javax.measure.Quantity<Q extends javax.measure.Quantity<Q>>
asType
in interface ComparableQuantity<Q extends javax.measure.Quantity<Q>>
type
- the quantity class identifying the nature of the measure.java.lang.ClassCastException
- if the dimension of this unit is different from the specified quantity dimension.java.lang.UnsupportedOperationException
- if the specified quantity class does not have a public static field named "UNIT" holding the SI unit for the quantity.Unit.asType(Class)
public static javax.measure.Quantity<?> parse(java.lang.CharSequence csq)
Quatity proportion = AbstractQuantity.parse("0.234").asType(Dimensionless.class);
Note: This method handles only standard
unit format. Locale-sensitive quantity parsing is currently not
supported.
csq
- the decimal value and its unit (if any) separated by space(s).QuantityFormat.getInstance().parse(csq)