android-calculatorpp/measure/src/main/java/javax/measure/unit/BaseUnit.java

112 lines
3.7 KiB
Java

/*
* JScience - Java(TM) Tools and Libraries for the Advancement of Sciences.
* Copyright (C) 2006 - JScience (http://jscience.org/)
* All rights reserved.
*
* Permission to use, copy, modify, and distribute this software is
* freely granted, provided that this notice is preserved.
*/
package javax.measure.unit;
import javax.measure.converter.UnitConverter;
import javax.measure.quantity.Quantity;
/**
* <p> This class represents the building blocks on top of which all others
* units are created. Base units are typically dimensionally independent.
* The actual unit dimension is determinated by the current
* {@link Dimension.Model model}. For example using the {@link
* Dimension.Model#STANDARD standard} model, {@link SI#CANDELA}
* has the dimension of {@link SI#WATT watt}:[code]
* // Standard model.
* BaseUnit<Length> METER = new BaseUnit<Length>("m");
* BaseUnit<LuminousIntensity> CANDELA = new BaseUnit<LuminousIntensity>("cd");
* System.out.println(METER.getDimension());
* System.out.println(CANDELA.getDimension());
*
* > [L]
* > [L]²·[M]/[T]³
* [/code]</p>
* <p> This class represents the "standard base units" which includes SI base
* units and possibly others user-defined base units. It does not represent
* the base units of any specific {@link SystemOfUnits} (they would have
* be base units accross all possible systems otherwise).</p>
*
* @author <a href="mailto:jean-marie@dautelle.com">Jean-Marie Dautelle</a>
* @version 3.1, April 22, 2006
* @see <a href="http://en.wikipedia.org/wiki/SI_base_unit">
* Wikipedia: SI base unit</a>
*/
public class BaseUnit<Q extends Quantity> extends Unit<Q> {
/**
* Holds the symbol.
*/
private final String _symbol;
/**
* Creates a base unit having the specified symbol.
*
* @param symbol the symbol of this base unit.
* @throws IllegalArgumentException if the specified symbol is
* associated to a different unit.
*/
public BaseUnit(String symbol) {
_symbol = symbol;
// Checks if the symbol is associated to a different unit.
synchronized (Unit.SYMBOL_TO_UNIT) {
Unit<?> unit = Unit.SYMBOL_TO_UNIT.get(symbol);
if (unit == null) {
Unit.SYMBOL_TO_UNIT.put(symbol, this);
return;
}
if (!(unit instanceof BaseUnit))
throw new IllegalArgumentException("Symbol " + symbol
+ " is associated to a different unit");
}
}
/**
* Returns the unique symbol for this base unit.
*
* @return this base unit symbol.
*/
public final String getSymbol() {
return _symbol;
}
/**
* Indicates if this base unit is considered equals to the specified
* object (both are base units with equal symbol, standard dimension and
* standard transform).
*
* @param that the object to compare for equality.
* @return <code>true</code> if <code>this</code> and <code>that</code>
* are considered equals; <code>false</code>otherwise.
*/
public boolean equals(Object that) {
if (this == that)
return true;
if (!(that instanceof BaseUnit))
return false;
BaseUnit<?> thatUnit = (BaseUnit<?>) that;
return this._symbol.equals(thatUnit._symbol);
}
@Override
public int hashCode() {
return _symbol.hashCode();
}
@Override
public Unit<? super Q> getStandardUnit() {
return this;
}
@Override
public UnitConverter toStandardUnit() {
return UnitConverter.IDENTITY;
}
private static final long serialVersionUID = 1L;
}