Javaのバージョンチェック

Javaのバージョンチェック

テストツールの中でイメージファイルを作成している。
イメージファイルはTIFFファイル。Java9以降でないとTIFFファイルは作れない。
(作れなくはないけれど、それ用のライブラリが必要になる。)
イメージ作成前に、Javaのバージョンをチェックすることにする。
テスト実行しつもりで、TIFF作成に失敗して無意味な試験が実行されていたので。

バージョンチェック方法

1
2
3
4
5
6
String javaClassVersion = System.getProperty("java.class.version");
double javaClassVersionD = Double.parseDouble(javaClassVersion);
if (javaClassVersionD < 53) {
    System.out.println("Java9以降をお使い下さい。");
    System.exit(5);
}

53がJava9なので、それより小さい場合はエラーにしている。

手元のJava実行環境を見てみたが、こうなっているようだ。

java6 50
java7 51
java8 52
java11 55

System.getProperty(“java.version”)でもバージョンが取得できるが、見やすい形のバージョンが返ってきてしまうため、比較では扱いにくい。

java6 1.6.0_20
java7 1.7.0_80
java8 1.8.0_181
java11 11.0.1

まとめ

本当は、Javaバージョンに依存したつくりは好きではないが、まだJava8も捨てられないので、もう少しこのまま様子を見よう。

同じタグの記事
同じカテゴリの記事

Ruby公式サイトの他言語とRubyの違いを眺めてみて

Ruby公式サイトの他の言語とRubyの違いを眺めてみて

www.ruby-lang.orgの多言語からのRuby入門が面白かった。
他の言語と同じところ、違うところがまとめられている。
個人的にPythonとJavaが得意で、そこを眺めてみたが、こういう風にまとめられていると導入しやすいと思う。
気になったところを書き出してみる。

irbと言われる対話型の実行環境がある

この環境はとても便利。使ったことのないクラスを使う必要がある場合や、普段から使っているけどなかなか覚えられないsubstringの区切り位置を確認するときに重宝する。
文字列の2バイト目から5バイト欲しいときはどう指定するのか。対話画面があるとすぐに試せる。

今でこそ、Javaにもjshellができたが、それまでは小さなプログラムを作って、コンパイルして実行する必要があった。Eclipse 2の頃はスクラッチパットがあったが、今はどうなのだろう。
irbでいろいろ試しながら、スクリプトを作ることにしよう。

三重引用符で複数行リテラル

これは、Pythonでも好きなところ。Rubyでも使えるのは良いことだ。
Javaだったら、StringBuilder使うのも面倒なので、Propertiesにでも書き出しておくだろうか。

リストは[]、辞書は{}

PythonのTupleは無いようだ。あまり使わないから、どっちらでもよいが。

メソッド呼び出しの括弧はオプション

さすがPerlの次の言語だ。メソッドの呼び出しに括弧がいらない。Perlもそうであった。
昔のVBの様に戻り値の無いときの利用なら許容範囲かと思う。

True、Falseはtrueとfalse。Noneの変わりはnil。

PythonもTrue、Falseはtrueとfalseになってくれれば良いのに。
Noneとnilはnullになってしまえば良いのに。

importの代わりにrequireを使う

JRubyから始めたので、requireとimportの違いがいまだによくわからない。

MyClass.new()

インスタンスの作成が独特。new()もメソッドの扱いなのだろうか。
PythonならMyClass()。Javaならnew MyClass()。知ってしまえば、どれでも大した差はないか。

==とequals()

Rubyで文字列の比較は==。Javaならequals。
Rubyにはequalsは無く、equal?がある。しかしRubyのequal?はオブジェクトの比較用。Javaとは逆の動きだ。

まとめ

RubyもPythonもJavaも違いがあって面白い。
本当は何か1つの言語を極めるべきなのかもしれないけど、同じ言語ばかりだと飽きてしまうので、あれもこれも使っていきたいと思っている。

同じタグの記事
同じカテゴリの記事

JRubyを久しぶりに

JRubyを久しぶりに

ツールを作る。いつもの通りJythonを使おうと思ったが、時間もあるのでJRubyにした。
以前は、JavaのAPIを繰り返し呼び出すだけの簡単なプログラムだったが、今回は少しだけJRubyでロジックも書いてみた。穴にはまった。

定数クラスから定数を取得するときは::を使う

java.awt.Colorから色を取得しようと思った。

1
2
3
4
5
6
7
8
9
10
11
import java.awt.Color
import java.awt.image.BufferedImage

bi = BufferedImage.new(100, 100, BufferedImage::TYPE_INT_RGB)
g = bi.createGraphics()

g.color = Color.BLUE
# → エラー

g.color = Color::BLUE
# → OK

Rubyでは、メソッドの呼び出しのみを.(ピリオド)で行い、その他の呼び出しは::(コロン2つ)を利用するようだ。
メソッドの呼び出しは.でも::でもどちらでも良いらしい。
java.awt.Colorの.はピリオドでも良いようだ。しかし、java.awt.Color::BLUEは::だ。なんだこれ。

Javaクラスのimportはimport

Rubyの外部ファイル読み込みはrequire。
だからといって、Javaのクラスがすべて外部ファイルで定義されているわけではないので、requireではいけない。javaと同じようにimportを利用する。

1
2
3
4
5
6
7
8
require "java"
# → これはJRubyを組むときは読んでおいた方が良いらしい。

require "java.awt.Color"
# → エラー

import "java.awt.Color"
# → OK

単純なセッター、ゲッターはプロパティの様に呼び出しても良い

これは、なかなか面白い。
また、キャメルケースなメソッドをスネークケースに変換しても呼び出せる。
メソッドの括弧も省略できる。

1
2
3
4
5
6
7
8
9
10
11
g.setColor(Color::RED)
# → Java的。しかしエラーではない。

g.set_color(Color::GREEN)
# → まだJava的。しかしエラーではない。

g.set_color Color::BLUE
# → もう少し。しかしエラーではない。

g.color = Color::YELLOW
# → OK

ゲッター、セッターをプロパティとして扱えるのはKotlinっぽい。

ブロックコメント

ブロックコメントは

1
=begin

から

1
=end

に適用される。
よく、ソースの先頭に覚書を残すので、ブロックコメントの使い方は覚えておかなくては。
しかし、ネットをみると、ブロックコメントはあまり使わないらしい。
行コメントの#を使うようだ。今はIDEが良くできているので、各行に#を補ってくれるのだろう。
また、Javaでも言われているが、ブロックコメントの中にブロックコメントは書けないので、そういう時のためにブロックコメントは残しておくのだろうか。

しかし、Pythonと同様に複数行コメントに三重引用符が使える。
これでコメントを残しても良いのかな?

スクリプト引数

ARGVに引数が入っている。ARGVは配列。sizeやlengthで引数の数を確認できる。

1
2
3
4
5
puts ARGV.size
puts ARGV.length
if ARGV.size > 0
    puts ARGV[0]
end

また、$0にスクリプト(コマンド)そのものが入っている。

1
2
puts $0
# → JRubyのirbで実行したらjirbが返ってきた。

まとめ

JRubyも良い言語だ。簡便に書けるし、実行速度も不足ない。
JythonとJRuby、どちらを選ぶかはなかなか悩む。

同じタグの記事
同じカテゴリの記事