@startuml abstract class Unit { -unitBase : ObjectProduct -nameSymbol : NameSymbol -dimension : ObjectProduct +{static} fromConversionFunctions(ObjectProduct, DoubleUnaryOperator, DoubleUnaryOperator) : Unit #Unit(ObjectProduct, NameSymbol) : Unit ~Unit(NameSymbol) : Unit +canConvertTo(Unit) : boolean +convertTo(Unit, double) : double #convertFromBase(double) : double #convertToBase(double) : double +isMetric() : boolean +withName(NameSymbol) : Unit } class BaseUnit { -dimension : BaseDimension -BaseUnit(BaseDimension, String, String, Set, double) : LinearUnit -LinearUnit(ObjectProduct, double, NameSymbol) : LinearUnit +convertTo(LinearUnit, UncertainDouble) : UncertainDouble +plus(LinearUnit) : LinearUnit +minus(LinearUnit) : LinearUnit +times(LinearUnit) : LinearUnit +dividedBy(LinearUnit) : LinearUnit +times(double) : LinearUnit +dividedBy(double) : LinearUnit +toExponent(int) : LinearUnit +withPrefix(UnitPrefix) : LinearUnit +withName(NameSymbol) : LinearUnit } class UnitPrefix { -multiplier : double +times(double) : UnitPrefix +dividedBy(double) : UnitPrefix } class UnitDatabase { -prefixlessUnits : Map -units : Map -prefixes : Map -dimensions : Map> -unitExpressionParser : ExpressionParser +loadUnitsFile(Path) -addUnitOrPrefixFromLine(String, long) +addUnit(String, Unit) +containsUnitName(String) : boolean +evaluateUnitExpression(String) : LinearUnitValue +getUnit(String) : Unit } class UnitValue { -unit : Unit -value : double +canConvertTo(Unit) : boolean +convertTo(Unit) : UnitValue +convertToLinear(LinearUnit) : LinearUnitValue } Unit <|-- BaseUnit Unit --* BaseUnit BaseDimension -o BaseUnit Unit <|-- LinearUnit Unit *- SI UnitValue --o Unit UnitDatabase --* Unit UnitDatabase --* UnitPrefix UnitDatabase --* BaseDimension UnitDatabase -* "4" ExpressionParser @enduml