001: /*
002: * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences.
003: * Copyright (C) 2006 - JScience (http://jscience.org/)
004: * All rights reserved.
005: *
006: * Permission to use, copy, modify, and distribute this software is
007: * freely granted, provided that this notice is preserved.
008: */
009: package javax.measure.unit;
010:
011: import javax.measure.converter.UnitConverter;
012: import javax.measure.quantity.Quantity;
013:
014: /**
015: * <p> This class represents the multi-radix units (such as "hour:min:sec").
016: * Instances of this class are created using the {@link Unit#compound
017: * Unit.compound} method.</p>
018: *
019: * <p> Examples of compound units:[code]
020: * Unit<Duration> HOUR_MINUTE_SECOND = HOUR.compound(MINUTE).compound(SECOND);
021: * Unit<Angle> DEGREE_MINUTE_ANGLE = DEGREE_ANGLE.compound(MINUTE_ANGLE);
022: * [/code]</p>
023: *
024: * @author <a href="mailto:jean-marie@dautelle.com">Jean-Marie Dautelle</a>
025: * @version 3.1, April 22, 2006
026: */
027: public final class CompoundUnit<Q extends Quantity> extends
028: DerivedUnit<Q> {
029:
030: /**
031: * Holds the higher unit.
032: */
033: private final Unit<Q> _high;
034:
035: /**
036: * Holds the lower unit.
037: */
038: private final Unit<Q> _low;
039:
040: /**
041: * Creates a compound unit from the specified units.
042: *
043: * @param high the high unit.
044: * @param low the lower unit(s)
045: * @throws IllegalArgumentException if both units do not the same system
046: * unit.
047: */
048: CompoundUnit(Unit<Q> high, Unit<Q> low) {
049: if (!high.getStandardUnit().equals(low.getStandardUnit()))
050: throw new IllegalArgumentException(
051: "Both units do not have the same system unit");
052: _high = high;
053: _low = low;
054:
055: }
056:
057: /**
058: * Returns the lower unit of this compound unit.
059: *
060: * @return the lower unit.
061: */
062: public Unit<Q> getLower() {
063: return _low;
064: }
065:
066: /**
067: * Returns the higher unit of this compound unit.
068: *
069: * @return the higher unit.
070: */
071: public Unit<Q> getHigher() {
072: return _high;
073: }
074:
075: /**
076: * Indicates if this compound unit is considered equals to the specified
077: * object (both are compound units with same composing units in the
078: * same order).
079: *
080: * @param that the object to compare for equality.
081: * @return <code>true</code> if <code>this</code> and <code>that</code>
082: * are considered equals; <code>false</code>otherwise.
083: */
084: public boolean equals(Object that) {
085: if (this == that)
086: return true;
087: if (!(that instanceof CompoundUnit))
088: return false;
089: CompoundUnit<?> thatUnit = (CompoundUnit<?>) that;
090: return this ._high.equals(thatUnit._high)
091: && this ._low.equals(thatUnit._low);
092: }
093:
094: @Override
095: public int hashCode() {
096: return _high.hashCode() ^ _low.hashCode();
097: }
098:
099: @Override
100: public Unit<? super Q> getStandardUnit() {
101: return _low.getStandardUnit();
102: }
103:
104: @Override
105: public UnitConverter toStandardUnit() {
106: return _low.toStandardUnit();
107: }
108:
109: private static final long serialVersionUID = 1L;
110: }
|