我正在处理一个使用基本和衍生测量单位的临床应用程序。
目前,我们将它们作为文本字段存储在每个需要单位的表的单独列中。但是,我计划重新设计数据库,以便在一个表中包含所有度量单位,并在表中使用需要UOM的外键。
这种解决了数据库级别的问题。但是,在Java代码中,我们使用String来存储单元,如下所示:
class Foo{
double amount;
String unit;
}
我想用String来存储单位可能会成为一个夜晚的母马。我需要一个干净的方法来管理测量单位的建议,以便我可以比较两个Foos或添加两个Foos,确保它们具有相同的单位等。
答案 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都支持它们。
如果你需要变得更复杂,有一些方法,但往往更复杂只是意味着更多麻烦不一定更好。