JSR 363¶
- 目次
- JSR 363
お知らせ¶
2019年に、JSR 385 Units of Measurement API 2.0 がリリースされました。
はじめに¶
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リポジトリにビルド済みのライブラリが置かれています。
ライブラリの入手(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
参考文献¶