プロジェクト

全般

プロフィール

JSR 363

はじめに

JSR 363 Units of Measurement は、度量衡を扱うライブラリのAPIを標準化したものです。
度量衡に関するAPIは、過去にJSR 275として仕様をまとめてJCP実行委員会に提出しましたが、その時は拒絶されてしまいました。拒絶の主な理由は、Java SE の標準となるには未熟、というもののようでした(厳しい!)。

Java Advent Calendar 2015に参加し、次にJSR363に関するブログを記載しました。
http://qiita.com/boochnich/items/7a24c39cbff5d1a95abb

度量衡に関する標準規格

  • ISO/IEC 80000
    定義、名称、記号などを規定

JSR 363関連のAPI、RI

仕様

  • パッケージ名は、javax.measure
  • インタフェースと例外を規定
    public interface Dimension
    public interface Quantity<Q extends Quantity<Q>>
    public interface Unit<Q extends Quantity<Q>>
    
  • SI単位系
    • 基本量と単位(長さ、質量、時間、電流、熱力学温度、物質量、光度)
    • 倍量の接頭辞(K、M、G、T、・・・)
    • 量の次元(基本量の単位のべき乗の積で表現できる量を定義する。速度は、長さL、時間Tを用いてL・T^-1)

参照実装

JSR 363の活動メンバーらによるAPI、参照実装、デモ、補足ライブラリ群が次のGitHubの下で開発されています。
https://github.com/unitsofmeasurement

この下にいくつかリポジトリがあります。

リポジトリ名 生成されるJAR 内容 提供パッケージ
unit-api unit-api-0.9-SNAPSHOT.jar JSR 363のAPIで規定される型を含んだmavenプロジェクト javax.measure
javax.measure.format
javax.measure.quantity
javax.measure.spi
unit-ri unit-ri-0.9-SNASHOT.jar JSR 363のAPIを実行可能にする参照実装を含んだmavenプロジェクト tec.units.ri
tec.units.ri.format
tec.units.ri.function
tec.units.ri.internal
tec.units.ri.quantity
tec.units.ri.spi
tec.units.ri.unit
si-units si-units-0.5-SNAPSHOT.jar
si-quantity-0.5-SNAPSHOT.jar
RIに収容されていない、SI単位系の広範囲な単位・量の定義を含んだmavenプロジェクト si.uom
si.uom.quantity
uom-se uom-se-0.9-SNAPSHOT.jar Java SE 8仕様を使った参照実装のmavenプロジェクト tec.uom.se
tec.uom.se.format
tec.uom.se.function
tec.uom.se.internal
tec.uom.se.quantity
tec.uom.se.spi
tec.uom.se.unit
uom-lib 業務分野固有のAPI定義、現時点で健康医療がある
uom-systems systems-common-0.2.jar
systems-common-java8-0.2.jar
systems-iso80k-0.2.jar
systems-iso80k-java8-0.2.jar
systems-quantity-0.2.jar
system-ucum-java8-0.2.jar
SI単位系以外の様々な単位系を含んだmavenプロジェクト。例えば米国ヤード・ポンド法、英国インペリアル系、他 systems.uom.common
systems.uom.iso80k
systems.uom.quantity
systems.uom.ucum
systems.uom.ucum.format
systems.uom.ucum.internal

ライブラリの入手(Mavenリポジトリ)

Mavenリポジトリにビルド済みのライブラリが置かれています。

リポジトリ名 URL
uom-api http://mvnrepository.com/artifact/javax.measure/unit-api
uom-ri http://mvnrepository.com/artifact/tec.units/unit-ri
uom-se http://mvnrepository.com/artifact/tec.uom/uom-se
si-units https://bintray.com/unitsofmeasurement/maven/si.uom%3Asi-units/view
https://bintray.com/unitsofmeasurement/maven/si.uom%3Asi-quantity/view
uom-systems https://bintray.com/unitsofmeasurement/maven/systems.uom%3Asystems-common/view
https://bintray.com/unitsofmeasurement/maven/systems.uom%3Asystems-iso80k/view
https://bintray.com/unitsofmeasurement/maven/systems.uom%3Asystems-quantity/view

ライブラリの入手(Github)とビルド

unit-api(JSR 363 API)の入手とビルド

gitでリポジトリをクローンします。
mavenでビルドします。

D:\work> git clone https://github.com/unitsofmeasurement/unit-api.git
D:\work> cd unit-api
D:\work\unit-api> maven package

ビルド結果、targetディレクトリ下にJARファイルが生成されます。

  • unit-api-0.9-SNAPSHOT.jar
  • unit-api-0.9-SNAPSHOT-sources.jar

javadoc生成でjdk8ではエラーとなってしまいました(ドキュメンテーションコメント内にjavadocが理解できないタグがある模様)。

unit-ri(JSR 363 参照実装)の入手とビルド

gitでリポジトリをクローンします。
mavenでビルドします。

D:\work> git clone https://github.com/unitsofmeasurement/unit-ri.git
D:\work> cd unit-ri
D:\work\unit-ri> maven package

targetディレクトリの下にjarファイルが生成されます。

  • unit-ri-0.9-SNAPSHOT.jar
  • unit-ri-0.9-SNAPSHOT-sources.jar
  • unit-ri-0.9-SNAPSHOT-test.jar

プログラミング

最初の一歩

実際にJSR 363の参照実装を使って最初のプログラムを作成・実行します。ビルドにはgradleを使って、作業はWindows OS上でコマンドプロンプトを使います。必要に応じてそれぞれの環境に置き換えてください。

プログラミング環境(gradle、コマンドプロンプト)

次が整っている前提で進めます。

  • JDK 8がインストールされ、javacコマンド等のあるディレクトリに環境変数PATHが通してある
  • Gradleがインストールされ、gradleコマンド等のあるディレクトリに環境変数PATHが通してある

作業ディレクトリの作成

作業ディレクトリを、D:\work\hello\とする場合の例で記述します。

D:\work\hello
  +-- build.gradle
  +-- src
        +-- main
              +-- java
                    +-- hello363
                          +-- Hello.java

build.gradleとHello.javaは後で記述します。

ビルド定義ファイル(build.gradle)の記述

作業ディレクトリ直下にGradleのビルド定義ファイルbuild.gradleを作成します。

apply plugin: 'application'

mainClassName = "hello363.Hello" 

repositories {
  jcenter()
}

dependencies {
  compile 'javax.measure:unit-api:0.8'
  compile 'tec.units:unit-ri:0.8'
}
  • 実行可能なプロジェクトとするため、gradle標準搭載applicationプラグインを使用します。
  • 実行時に呼ぶmainメソッドを持つクラスをmainClassNameで定義します。
  • JSR 363プログラミングで最低限必要とするAPIと参照実装を依存ライブラリとして定義します。ライブラリは外部のリポジトリjcenterを使用します。

Javaソースファイル(Hello.java)の記述

package hello363;

import javax.measure.Quantity;
import javax.measure.quantity.Length;
import tec.units.ri.quantity.Quantities;
import static tec.units.ri.unit.Units.METRE;
import static tec.units.ri.unit.MetricPrefix.CENTI;

public class Hello {
    public static void main(String... args) {
    System.out.println("12.5m + 25cm = ?");
    Quantity<Length> m = Quantities.getQuantity(12.5, METRE);
    Quantity<Length> cm = Quantities.getQuantity(25, CENTI(METRE));
    Quantity<Length> mcm = m.add(cm);
    System.out.printf("%s + %s = %s%n", m, cm, mcm);
    }
}

長さの物理量は、単位によらずQuantity<Length> 型で保持します。
単位が異なるQuantity<Length>同士を演算すると、単位の合わせを実施してくれます。

ビルドおよび実行

ビルドは、gradleのbuildタスクを実行します。

D:\work\hello> gradle builld
:compileJava
:processResources UP-TO-DATE
:classes
:jar
:startScripts
:distTar
:distZip
:assemble
:compileTestJava UP-TO-DATE
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE
:test UP-TO-DATE
:check UP-TO-DATE
:build

BUILD SUCCESSFUL

Total time: 8.342 secs

実行は、gradleのrunタスクを実行します。

D:\work\hello> gradle run
:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:run
Hello, JSR 363 Units of Measurement API!
12.5m + 25cm = ?
12.5 m + 25 cm = 12.75 m

BUILD SUCCESSFUL

Total time: 6.57 secs

参考文献

クリップボードから画像を追加 (サイズの上限: 1 GB)