Хранение и управление единицей измерений - PullRequest
1 голос
/ 23 марта 2012

Я имею дело с клиническим применением, в котором используются как базовые, так и производные единицы измерения.

В настоящее время мы храним их в виде текстового поля в отдельном столбце в каждой таблице, для которой требуются единицы измерения. Однако я планирую изменить структуру базы данных таким образом, чтобы у нас были все единицы измерения в одной таблице и использовались внешние ключи в таблице, для которых требуются единицы измерения.

Этот тип решает проблему на уровне базы данных. Однако в коде Java мы используем String для хранения модулей следующим образом:

class Foo{
     double amount;
     String unit;
}

Я полагаю, что использование String для хранения юнитов может превратиться в ночную кобылу в будущем. Мне нужны предложения по чистому способу управления единицами измерения, чтобы я мог, скажем, сравнить два Foo или добавить два Foo, убедившись, что они имеют одинаковые единицы и т. Д.

Ответы [ 3 ]

1 голос
/ 23 марта 2012

Я думаю, вы должны иметь лучшую абстракцию, чем String; это немного больше, чем примитив.

Я бы написал класс Units, который бы анализировал и сохранял эти строки из базы данных и позволял вам легко их сравнивать.

public class Units {
    private final String name;

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

Также может быть полезно иметь категории единиц. (Вы можете измерить давление многими способами.) Британские и международные подразделения могут описать одно и то же.

Вы также можете иметь категории на основе физических величин (например, сила, масса, заряд, время и т. Д.)

0 голосов
/ 23 марта 2012

Если оставить в стороне проблемы с конверсией, перечисления - хороший способ решить эту проблему:

enum Units {
  Kilograms,Pounds,Stone
}

class Foo {
  double amount;
  Units units;
}

Большинство ORM преобразуют перечисление в строку. Ваша Java является типобезопасной, и вы можете сделать базу данных согласованной, используя простое ограничение проверки. Практически все РСУБД поддерживают их.

Если вам нужно стать более изощренным, существуют способы, но зачастую более сложные просто означают больше проблем, а вовсе не лучше.

0 голосов
/ 23 марта 2012

Я бы порекомендовал библиотеку JScience , которая является реализацией JSR 275 .

Согласно этой записи он может выполнять такие действия, как:

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

Если вы не хотите добавлять новую библиотеку, нет ничего плохого в использовании String объектов в классе.Если вы никогда не собираетесь выполнять расчеты по ним, вам еще меньше о чем беспокоиться.Однако вам, скорее всего, потребуется использовать Double s, поскольку это будет способом получения «правильных» переводов в и из метрической системы.

...