存储和管理测量单位

时间:2012-03-22 23:23:09

标签: java units-of-measurement

我正在处理一个使用基本和衍生测量单位的临床应用程序。

目前,我们将它们作为文本字段存储在每个需要单位的表的单独列中。但是,我计划重新设计数据库,以便在一个表中包含所有度量单位,并在表中使用需要UOM的外键。

这种解决了数据库级别的问题。但是,在Java代码中,我们使用String来存储单元,如下所示:

class Foo{
     double amount;
     String unit;
}

我想用String来存储单位可能会成为一个夜晚的母马。我需要一个干净的方法来管理测量单位的建议,以便我可以比较两个Foos或添加两个Foos,确保它们具有相同的单位等。

3 个答案:

答案 0 :(得分:1)

我认为你应该有一个比String更好的抽象;它只不过是原始的。

我会编写一个Units类来解析和存储数据库中的字符串,并允许您轻松地比较它们。

public class Units {
    private final String name;

    // constructors, equals, hashCode, toString and other operations here
}

拥有单位类别可能也很有用。 (你可以通过很多方式衡量压力。)英国和国际单位可以描述同样的事情。

您可能还有基于物理量的类别(例如力,质量,电荷,时间等)

答案 1 :(得分:0)

我建议使用JScience library作为JSR 275的实现。

根据this post,它可以执行以下操作:

UnitConverter toKilometers = MILE.getConverterTo(KILOMETER);
double km = toKilometers.convert(Measure.valueOf(100, MILE).doubleValue(MILE));

如果您不想添加新库,那么在类中使用String对象并不存在任何错误。如果你永远不会对它们进行计算,那就更不用担心了。但是,您很可能需要使用Double,因为这将是从公制系统获取“正确”翻译的方法。

答案 2 :(得分:0)

除了转换问题,枚举是解决此问题的公平方法:

enum Units {
  Kilograms,Pounds,Stone
}

class Foo {
  double amount;
  Units units;
}

大多数ORM会将枚举转换为String。您的Java是类型安全的,您可以使用简单的检查约束使数据库保持一致。几乎所有的RDBMS都支持它们。

如果你需要变得更复杂,有一些方法,但往往更复杂只是意味着更多麻烦不一定更好。